ระบบปฏิบัติการสร้างเอนโทรปีสำหรับเมล็ดสุ่มอย่างไร


19

บน Linux ไฟล์/dev/randomและ/dev/urandomไฟล์คือแหล่งข้อมูลการบล็อกและไม่บล็อก (ตามลำดับ) ของการสุ่มหลอก

พวกเขาสามารถอ่านเป็นไฟล์ปกติ:

$ hexdump /dev/random
0000000 28eb d9e7 44bb 1ac9 d06f b943 f904 8ffa
0000010 5652 1f08 ccb8 9ee2 d85c 7c6b ddb2 bcbe
0000020 f841 bd90 9e7c 5be2 eecc e395 5971 ab7f
0000030 864f d402 74dd 1aa8 925d 8a80 de75 a0e3
0000040 cb64 4422 02f7 0c50 6174 f725 0653 2444
...

ตัวแปรยูนิกซ์อื่น ๆ อีกมากมายให้/dev/randomและ/dev/urandomเช่นกันโดยไม่มีความแตกต่างการบล็อก / ไม่บล็อก

เทียบเท่า Windows เป็นฟังก์ชั่นCryptGenRandom()

ระบบปฏิบัติการสร้างการสุ่มหลอกได้อย่างไร


คุณทำวิจัยอะไร คุณดูไซต์มาตรฐานเช่น Wikipedia หรือ Security.SE หรือ Crypto.SE หรือไม่ วิกิพีเดียมีบทความเกี่ยวกับนี้: en.wikipedia.org/wiki//dev/random เมื่อ Wikipedia มีบทความที่ตอบคำถามของคุณนั่นเป็นคำจำกัดความของการวิจัยที่ไม่เพียงพอ (เราคาดหวังให้คุณทำการวิจัยจำนวนมากก่อนที่จะถามที่นี่และเพื่อแสดงให้เราเห็นในการวิจัยคำถามที่คุณทำ)
DW

คำตอบ:


31

ชื่อและเนื้อหาของคำถามของคุณถามคำถามที่แตกต่างกันสองข้อ: ระบบปฏิบัติการสร้างเอนโทรปีได้อย่างไร (นี่ควรจะได้รับเอนโทรปี) และวิธีสร้างเอนโทรปีแบบสุ่มจากเอนโทรปีนี้ ฉันจะเริ่มต้นด้วยการอธิบายความแตกต่าง

การสุ่มมาจากไหน

ตัวสร้างตัวเลขสุ่ม (RNG) มีสองประเภท:

  • Pseudo-random number generators (PRNG) หรือที่เรียกว่าdeterministic random bit generators (DRBG) หรือการรวมกันของมันเป็นอัลกอริธึมที่กำหนดขึ้นซึ่งรักษาตัวแปรภายในขนาดคงที่และคำนวณเอาท์พุทจากสถานะนั้น
  • ตัวสร้างหมายเลขสุ่มฮาร์ดแวร์ (HRNG) หรือที่เรียกว่าเครื่องกำเนิดตัวเลขแบบ "จริง" นั้นขึ้นอยู่กับปรากฏการณ์ทางกายภาพ “ จริง” เป็นบิตของผู้เรียกชื่อผิดเนื่องจากไม่มีแหล่งข้อมูลที่รู้ว่าสุ่มอย่างแท้จริงแหล่งข้อมูลที่ไม่สามารถคาดเดาได้เท่านั้น

แอปพลิเคชั่นบางตัวเช่นการจำลองปรากฏการณ์ทางกายภาพอาจเป็นเนื้อหาที่มีตัวเลขสุ่มที่ผ่านการทดสอบทางสถิติ แอปพลิเคชันอื่น ๆ เช่นการสร้างคีย์การเข้ารหัสลับต้องมีคุณสมบัติที่ดีกว่า: ความคาดเดาไม่ได้ Unpredictability เป็นคุณสมบัติด้านความปลอดภัยไม่ใช่ (เฉพาะ) คุณสมบัติทางสถิติ: หมายความว่าฝ่ายตรงข้ามไม่สามารถเดาเอาท์พุทของตัวสร้างตัวเลขสุ่มได้ (แม่นยำยิ่งขึ้นคุณสามารถวัดคุณภาพของ RNG ได้โดยการวัดความน่าจะเป็นที่คู่ต่อสู้จะเดาเอาท์พุท RNG แต่ละบิตหากความน่าจะเป็นนั้นแตกต่างจาก 1/2 แสดงว่า RNG ไม่ดี)

มีปรากฏการณ์ทางกายภาพที่ผลิตข้อมูลสุ่มที่มีคุณสมบัติทางสถิติที่ดี - ตัวอย่างเช่นการสลายตัวของกัมมันตภาพรังสีหรือการสังเกตการณ์ทางดาราศาสตร์ของเสียงพื้นหลังหรือความผันผวนของตลาดหุ้น การวัดทางกายภาพดังกล่าวต้องการการปรับสภาพ (การฟอกสีฟัน ) เพื่อเปลี่ยนการแจกแจงความน่าจะเป็นแบบอคติให้เป็นการกระจายความน่าจะเป็นแบบเดียวกัน การวัดทางกายภาพที่ทุกคนรู้ว่าไม่ดีสำหรับการเข้ารหัส: ความผันผวนของตลาดหุ้นอาจจะดีสำหรับการใช้geohashingแต่คุณไม่สามารถใช้มันเพื่อสร้างรหัสลับได้

การเข้ารหัสต้องมีความลับ : ฝ่ายตรงข้ามต้องไม่สามารถค้นหาข้อมูลที่เข้าสู่การปรับสภาพ มีการรักษาความปลอดภัย cryptographically สุ่มหลอกกำเนิดจำนวนขั้นตอนวิธีการ PRNG ที่ส่งออกซึ่งเหมาะสำหรับการใช้งานในการใช้งานการเข้ารหัสลับที่นอกเหนือไปจาก: (CSPRNG) มีคุณสมบัติทางสถิติที่ดี หนึ่งในคุณสมบัติที่ทำให้ CSPRNG ปลอดภัยการเข้ารหัสคือผลลัพธ์ของมันไม่อนุญาตให้ฝ่ายตรงข้ามสร้างสถานะภายในขึ้นมาใหม่ (รู้บิตทั้งหมด แต่สร้างโดย CSPRNG ไม่ได้ช่วยหาบิตที่หายไป) ฉันจะไม่ทำตามวิธีการทำ CSPRNG เพราะนั่นเป็นบิตที่ง่าย - คุณสามารถทำตามสูตรที่กำหนดโดย cryptographers มืออาชีพ (ใช้มาตรฐานขั้นตอนวิธีการเช่น Hash_DRBG, HMAC_DRBG หรือ CTR_DRBG จากNIST SP 800-90A ) หรือANSI X9.31 PRNG CSPRNG ต้องการสองคุณสมบัติของสถานะเพื่อความปลอดภัย:

  • รัฐจะต้องเก็บเป็นความลับตั้งแต่เริ่มต้นและตลอดเวลา (แม้ว่าการเปิดเผยของรัฐจะไม่เปิดเผยผลลัพธ์ที่ผ่านมา)
  • สถานะจะต้องเป็นเชิงเส้น: RNG จะต้องไม่เริ่มสองครั้งจากสถานะเดียวกัน

สถาปัตยกรรมของเครื่องกำเนิดตัวเลขสุ่ม

ในทางปฏิบัติผู้สร้างตัวเลขสุ่มที่ดีเกือบทั้งหมดรวม CSPRNG เข้ากับแหล่งข้อมูลเอนโทรปีหนึ่งรายการขึ้นไป เอนโทรปีคือตัวชี้วัดความไม่แน่นอนของแหล่งข้อมูล การอ้างอิงตัวสร้างตัวเลขสุ่มบนฮาร์ดแวร์ RNG นั้นยาก:

  • ข้อมูลทางกายภาพแบบดิบมีแนวโน้มว่าจะต้องมีการปรับสภาพเพื่อเปลี่ยนข้อมูลความน่าจะเป็นการกระจายแบบสม่ำเสมอ
  • ผลลัพธ์จากแหล่งที่มาของการสุ่มต้องถูกเก็บเป็นความลับ
  • แหล่งเอนโทรปีมักจะช้าเมื่อเทียบกับความต้องการ

ดังนั้น RNG ในระบบปฏิบัติการมักจะทำงานดังนี้:

  1. สะสมเอนโทรปีที่เพียงพอเพื่อสร้างสถานะภายในที่ไม่แน่นอน
  2. รันCSPRNGโดยใช้เอนโทรปีที่สะสมเป็นเมล็ดเช่นค่าเริ่มต้นของสถานะภายใน
  3. เลือกผสมเอนโทรปีเพิ่มเติมเข้าสู่สถานะภายในเป็นระยะ (สิ่งนี้ไม่จำเป็นอย่างเคร่งครัดเนื่องจากเอนโทรปีไม่ได้“ บริโภค” ในอัตราใด ๆ ที่สามารถวัดได้มันช่วยต่อต้านภัยคุกคามบางอย่างที่รั่วไหลสถานะ RNG โดยไม่กระทบต่อระบบทั้งหมด)

บริการสร้างหมายเลขสุ่มเป็นส่วนหนึ่งของงานของระบบปฏิบัติการเนื่องจากการรวบรวมเอนโทรปีต้องการการเข้าถึงฮาร์ดแวร์และแหล่งข้อมูลเอนโทรปีเป็นทรัพยากรที่ใช้ร่วมกัน: ระบบปฏิบัติการจะต้องรวบรวมและรับเอาท์พุทจากแอพพลิเคชันที่เหมาะสม ต้องมีการปรับเงื่อนไขแบบสุ่มหลอกของแหล่งข้อมูลเอนโทรปีในระบบปฏิบัติการ มันอาจจะมีความปลอดภัยในการเข้ารหัสเพราะมันไม่ได้เป็นเรื่องยาก (และเป็นสิ่งจำเป็นสำหรับระบบปฏิบัติการที่แอปพลิเคชันไม่เชื่อถือซึ่งกันและกันในระบบที่มีความร่วมมืออย่างเต็มที่แต่ละแอปพลิเคชันจะต้องเรียกใช้ CSPRNG ของตนเอง ไม่ได้ให้หนึ่ง)

ระบบส่วนใหญ่ที่มีที่จัดเก็บข้อมูลถาวรจะโหลดเมล็ดพันธุ์ RNG จากดิสก์ (ฉันจะใช้ "ดิสก์" เป็นตัวย่อสำหรับหน่วยความจำประเภทใดก็ตาม) เมื่อบูตและเขียนทับเมล็ดด้วยข้อมูลปลอมแบบสุ่มที่สร้างขึ้นจากเมล็ดนั้น หรือหากมีให้พร้อมกับข้อมูลแบบสุ่มที่สร้างจากเมล็ดนั้นบวกกับแหล่งข้อมูลเอนโทรปีอื่น วิธีนี้แม้ว่าเอนโทรปีจะไม่สามารถใช้งานได้หลังจากรีบูตเครื่อง แต่เอนโทรปีจากเซสชันก่อนหน้าจะถูกนำมาใช้ซ้ำ

ต้องใช้ความระมัดระวังเกี่ยวกับสถานะที่บันทึกไว้ จำได้ว่าฉันพูดว่ารัฐจะต้องเป็นเชิงเส้น? หากคุณบู๊ตสองครั้งจากสถานะดิสก์เดียวกันคุณจะได้ผลลัพธ์ RNG เดียวกัน หากนี่เป็นไปได้ในสภาพแวดล้อมของคุณคุณต้องมีแหล่งข้อมูลเอนโทรปีอื่น ดูแลเมื่อคืนจากการสำรองข้อมูลหรือเมื่อโคลนเครื่องเสมือน เทคนิคหนึ่งสำหรับการโคลนคือการผสมเอนโทรปีที่เก็บไว้กับข้อมูลสิ่งแวดล้อมบางอย่างที่คาดเดาได้ แต่ไม่ซ้ำกัน (เช่นเวลาและที่อยู่ MAC) ระวังว่าหากข้อมูลด้านสิ่งแวดล้อมสามารถคาดการณ์ได้ใครก็ตามที่ครอบครองสถานะ VM ที่เก็บไว้สามารถสร้างเมล็ดของอินสแตนซ์ VM ที่แยกออกมาได้

แหล่งเอนโทรปี

การค้นหา (และใช้อย่างถูกต้อง) แหล่งข้อมูลเอนโทรปีเป็นส่วนที่ท้าทายที่สุดของการสร้างตัวเลขสุ่มในระบบปฏิบัติการ แหล่งข้อมูลเอนโทรปีที่มีอยู่จำเป็นต้องขึ้นอยู่กับฮาร์ดแวร์และสภาพแวดล้อมที่ฮาร์ดแวร์ทำงานอยู่

หากคุณโชคดีฮาร์ดแวร์ของคุณจะมีอุปกรณ์ต่อพ่วงซึ่งสามารถใช้เป็นแหล่งข้อมูลเอนโทรปี: เครื่องกำเนิดหมายเลขสุ่มฮาร์ดแวร์ไม่ว่าจะเป็นแบบเฉพาะหรือแบบด้านข้าง ตัวอย่างเช่น:

NIST SP800-90Bให้แนวทางการออกแบบสำหรับฮาร์ดแวร์ RNG การประเมินฮาร์ดแวร์ RNG คือเรื่องยาก โดยทั่วไปฮาร์ดแวร์ RNG นั้นเป็นสัตว์ที่บอบบางซึ่งจำเป็นต้องใช้ด้วยความระมัดระวัง: หลายประเภทต้องการเวลาหลังจากการบู๊ตและบางครั้งระหว่างการอ่านเพื่อทำให้เสถียรพวกมันมักจะไวต่อสภาพแวดล้อมเช่นอุณหภูมิเป็นต้น

อินเทล x86-64 ประมวลผลขึ้นอยู่กับIvy Bridgeสถาปัตยกรรมให้RdRandการเรียนการสอนซึ่งมีการส่งออกจากที่CSPRNG เมล็ดด้วยเสียงความร้อน สมาร์ทโฟนส่วนใหญ่โปรเซสเซอร์มีแหล่งข้อมูลเอนโทรปีของฮาร์ดแวร์แม้ว่า Android จะไม่ใช้มันเสมอไป

ระบบที่ไม่มีแหล่งเอนโทรปีที่แข็งแกร่งต้องทำอย่างไรกับการรวมแหล่งเอนโทรปีที่อ่อนแอเข้าด้วยกันและหวังว่า ( มั่นใจได้ว่าจะมีคำแรงเกินไป) ว่าพวกเขาจะพอเพียง การเคลื่อนไหวของเมาส์แบบสุ่มนั้นเป็นที่นิยมสำหรับเครื่องไคลเอนต์และคุณอาจเคยเห็นการรักษาความปลอดภัยโดยโปรแกรมเข้ารหัสบางอย่างที่ขอให้คุณเลื่อนเมาส์ (แม้ว่าในระบบปฏิบัติการพีซีศตวรรษที่ 21 ระบบปฏิบัติการจะสะสมเอนโทรปี)โดยไม่ต้องกังวล )

หากคุณต้องการดูตัวอย่างเช่นคุณสามารถดูลินุกซ์ แต่ระวังว่ามันจะไม่สมบูรณ์แบบ โดยเฉพาะอย่างยิ่ง/dev/randomบล็อกบ่อยเกินไป (เพราะบล็อกจนกว่าเอนโทรปีเพียงพอที่จะใช้ได้กับความคิดอนุรักษ์นิยมมากเกินไปของเอนโทรปี) ในขณะที่/dev/urandomเกือบจะดีเสมอยกเว้นในการบูตครั้งแรก แต่ไม่มีข้อบ่งชี้ว่าเมื่อไม่มีเอนโทรปีเพียงพอ Linux มีไดรเวอร์สำหรับอุปกรณ์ HRNG จำนวนมากและในการเก็บรวบรวมพลังงานจากอุปกรณ์ต่าง ๆ(รวมถึงอุปกรณ์อินพุต ) และดิสก์กำหนดเวลา

หากคุณมีที่เก็บข้อมูลถาวร (เป็นความลับ) คุณสามารถใช้มันเพื่อบันทึกเอนโทรปีจากการบู๊ตหนึ่งไปยังการบู๊ตครั้งถัดไปตามที่ระบุไว้ข้างต้น การบู๊ตครั้งแรกนั้นเป็นช่วงเวลาที่ละเอียดอ่อน: ระบบอาจอยู่ในสถานะที่สามารถคาดการณ์ได้อย่างเป็นธรรม ณ จุดนั้นโดยเฉพาะอย่างยิ่งกับอุปกรณ์ที่ผลิตจำนวนมากซึ่งทำงานโดยส่วนใหญ่จากโรงงานในลักษณะเดียวกัน อุปกรณ์ฝังตัวบางตัวที่มีที่เก็บข้อมูลถาวรจะได้รับการจัดเตรียมด้วยเมล็ดเริ่มต้นในโรงงาน (ผลิตโดย RNG ที่ทำงานบนคอมพิวเตอร์ในโรงงาน) ในสภาพแวดล้อมเซิร์ฟเวอร์แบบเสมือนสามารถกำหนดค่าเอนโทรปีเริ่มต้นเมื่อสร้างเครื่องเสมือนจากโฮสต์หรือจากเซิร์ฟเวอร์เอนโทรปี

อุปกรณ์ที่มีเมล็ดไม่ดีเป็นปัญหาที่แพร่หลายในทางปฏิบัติ - การศึกษาคีย์ RSA สาธารณะพบว่าเซิร์ฟเวอร์และอุปกรณ์จำนวนมากมีคีย์ที่สร้างขึ้นด้วย RNG ที่ไม่ดีซึ่งน่าจะเป็น PRNG ที่ดีซึ่งไม่ได้รับการฝึกฝน ในฐานะผู้ออกแบบระบบปฏิบัติการคุณไม่สามารถแก้ไขปัญหานี้ได้ด้วยตัวเอง: เป็นหน้าที่ของเอนทิตีในการควบคุมห่วงโซ่การปรับใช้เพื่อให้แน่ใจว่า RNG จะได้รับการ seed อย่างถูกต้องตั้งแต่เริ่มระบบครั้งแรก งานของคุณในฐานะผู้ออกแบบระบบปฏิบัติการคือจัดเตรียม RNG ที่เหมาะสมรวมถึงอินเทอร์เฟซเพื่อจัดหาเมล็ดพันธุ์แรกนั้นและเพื่อให้แน่ใจว่าการส่งสัญญาณข้อผิดพลาดที่เหมาะสมหากใช้ RNG ก่อนที่จะทำการเพาะเมล็ดอย่างเหมาะสม


5
ตอบตัวเอกที่เลว
Adam Maras

นี่ == ยอดเยี่ยม

"ไม่มีแหล่งข้อมูลที่รู้ว่าสุ่มอย่างแท้จริง" ฉันไม่เห็นด้วย การตีความที่แพร่หลาย (โคเปนเฮเกน) ของกลศาสตร์ควอนตัมบอกว่าผลลัพธ์ของการวัดระบบที่อยู่ในการซ้อนทับของผลลัพธ์ที่เป็นไปได้นั้นเป็นการสุ่มอย่างแท้จริงในแง่ที่ว่าเราไม่สามารถทำนายผลลัพธ์ได้ . ที่มา: นักเรียนระดับฟิสิกส์ที่นี่
balu

3

นอกจากคำตอบของ Gilles แล้วอินเตอร์รัปต์ยังสามารถใช้เพื่อสร้างเอนโทรปี ตัวอย่างเช่นใน Linux เมื่อเพิ่มตัวจัดการขัดจังหวะคุณสามารถกำหนดได้ว่าควรใช้การเกิดขึ้นของการขัดจังหวะนี้เป็นการสนับสนุนส่วนเอนโทรปีของเคอร์เนลหรือไม่

แน่นอนว่าสิ่งนี้ไม่ควรขัดจังหวะด้วยว่าผู้โจมตีอาจสามารถระบุได้ ตัวอย่างเช่นในครั้งแรกที่การรับส่งข้อมูลเครือข่าย (เช่นการขัดจังหวะที่เกิดขึ้น) ดูเหมือนจะเป็นแหล่งที่มาของการสุ่ม อย่างไรก็ตามผู้โจมตีอาจสามารถจัดการปริมาณการใช้งานของคุณในวิธีที่เขาสามารถคาดการณ์การสุ่มที่คุณต้องการสำหรับการดำเนินการบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.