ชื่อและเนื้อหาของคำถามของคุณถามคำถามที่แตกต่างกันสองข้อ: ระบบปฏิบัติการสร้างเอนโทรปีได้อย่างไร (นี่ควรจะได้รับเอนโทรปี) และวิธีสร้างเอนโทรปีแบบสุ่มจากเอนโทรปีนี้ ฉันจะเริ่มต้นด้วยการอธิบายความแตกต่าง
การสุ่มมาจากไหน
ตัวสร้างตัวเลขสุ่ม (RNG) มีสองประเภท:
แอปพลิเคชั่นบางตัวเช่นการจำลองปรากฏการณ์ทางกายภาพอาจเป็นเนื้อหาที่มีตัวเลขสุ่มที่ผ่านการทดสอบทางสถิติ แอปพลิเคชันอื่น ๆ เช่นการสร้างคีย์การเข้ารหัสลับต้องมีคุณสมบัติที่ดีกว่า: ความคาดเดาไม่ได้ 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 ในระบบปฏิบัติการมักจะทำงานดังนี้:
- สะสมเอนโทรปีที่เพียงพอเพื่อสร้างสถานะภายในที่ไม่แน่นอน
- รันCSPRNGโดยใช้เอนโทรปีที่สะสมเป็นเมล็ดเช่นค่าเริ่มต้นของสถานะภายใน
- เลือกผสมเอนโทรปีเพิ่มเติมเข้าสู่สถานะภายในเป็นระยะ (สิ่งนี้ไม่จำเป็นอย่างเคร่งครัดเนื่องจากเอนโทรปีไม่ได้“ บริโภค” ในอัตราใด ๆ ที่สามารถวัดได้มันช่วยต่อต้านภัยคุกคามบางอย่างที่รั่วไหลสถานะ 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 ก่อนที่จะทำการเพาะเมล็ดอย่างเหมาะสม