0Pricing
Cryptology Academy · บทเรียน

NIST SP 800-90A: มาตรฐาน DRBG

ทำความเข้าใจเฟรมเวิร์ก DRBG ของ NIST ตั้งแต่การสร้างอินสแตนซ์ การตั้งค่าเริ่มต้นใหม่ ความต้านทานการคาดการณ์ ไปจนถึงระดับความปลอดภัย

NIST SP 800-90A: มาตรฐาน DRBG เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องใช้ตัวสร้างบิตสุ่มแบบกำหนดได้

การดำเนินการด้านการเข้ารหัสต้องใช้ตัวเลขสุ่มคุณภาพสูง เช่น การสร้างกุญแจ ค่าที่ใช้ครั้งเดียว IV ค่าเกลือ และโทเค็นเซสชัน ตัวสร้างตัวเลขสุ่มแท้จริง (TRNG) รวบรวมเอนโทรปีจากแหล่งทางกายภาพ (สัญญาณรบกวนจากฮาร์ดแวร์ การขัดจังหวะ และสัญญาณรบกวนจากความร้อน) แต่ทำงานช้าและอาจไม่พร้อมใช้งานเสมอไป โดยเฉพาะในเครื่องเสมือนหรือช่วงเริ่มต้นการบูต ตัวสร้างบิตสุ่มแบบกำหนดได้ (DRBG) แก้ปัญหานี้โดยเริ่มต้น DRBG ด้วยเอนโทรปีแท้จริงปริมาณเล็กน้อย แล้วใช้อัลกอริทึมการเข้ารหัสขยายให้เป็นกระแสบิตเสมือนสุ่มขนาดใหญ่ที่ผู้โจมตีซึ่งมีทรัพยากรในการคำนวณไม่สามารถแยกแยะจากสุ่มแท้จริงได้ NIST SP 800-90A กำหนดกลไก DRBG ที่ได้รับการรับรองสามแบบ ซึ่งถูกใช้ในระบบการเข้ารหัสสมัยใหม่แทบทั้งหมด

วงจรชีวิตของ DRBG: เริ่มต้น สร้างผลลัพธ์ และเติมเมล็ดใหม่

DRBG ทำงานผ่านการดำเนินการพื้นฐานสามอย่าง การเริ่มต้น: เริ่มต้นสถานะภายในของ DRBG โดยใช้ entropy_input (จากแหล่งเอนโทรปี) ค่าใช้ครั้งเดียว (ค่าที่ใช้เพียงครั้งเดียวเพื่อรับประกันความไม่ซ้ำกัน) และ personalization_string (บริบทเฉพาะของแอปพลิเคชัน ซึ่งเป็นทางเลือก) การสร้างผลลัพธ์: สร้างบิตเสมือนสุ่มตามจำนวนที่ร้องขอ และอัปเดตสถานะภายในเพื่อป้องกันการย้อนรอย การเติมเมล็ดใหม่: ใส่เอนโทรปีใหม่เข้าไปในสถานะของ DRBG เพื่อให้เกิดความต้านทานการคาดเดา หลังจากเติมเมล็ดใหม่แล้ว แม้ผู้โจมตีที่ทราบสถานะก่อนหน้าก็ไม่สามารถคาดเดาผลลัพธ์ในอนาคตได้ NIST กำหนดช่วงห่างสูงสุดของการสร้างผลลัพธ์ (reseed_interval): ต้องเติมเมล็ดใหม่หลังคำขอ 2^48 ครั้งสำหรับ DRBG ทั้งสามประเภท

ระดับความแข็งแกร่งด้านความปลอดภัยและการเลือกพารามิเตอร์

NIST SP 800-90A กำหนดระดับความแข็งแกร่งด้านความปลอดภัยไว้สี่ระดับ ได้แก่ 112, 128, 192 และ 256 บิต ความแข็งแกร่งด้านความปลอดภัยจะกำหนดเอนโทรปีขั้นต่ำที่ต้องใช้เมื่อเริ่มต้น รวมถึงคุณภาพของผลลัพธ์ที่สร้างขึ้น สำหรับความปลอดภัยระดับ 128 บิต ข้อมูลนำเข้าเอนโทรปีต้องมีเอนโทรปีอย่างน้อย 128 บิต ความสัมพันธ์คือ: เอนโทรปีจำนวน security_strength บิต -> เอาต์พุตของ DRBG ที่ผู้โจมตีซึ่งมีการดำเนินการ 2^security_strength ครั้งไม่สามารถแยกแยะจากข้อมูลสุ่มได้ในทางการคำนวณ การเลือกความยาวกุญแจ (AES-128 เทียบกับ AES-256) และการเลือกแฮช (SHA-256 เทียบกับ SHA-512) ต้องสอดคล้องกับหรือสูงกว่าความแข็งแกร่งด้านความปลอดภัยที่ต้องการ การกำหนดพารามิเตอร์มากเกินไป (ใช้ SHA-512 สำหรับความปลอดภัยระดับ 128 บิต) ปลอดภัยแต่สิ้นเปลือง ส่วนการกำหนดพารามิเตอร์น้อยเกินไปจะทำให้ความปลอดภัยเสียหาย

โครงสร้าง Hash_DRBG

Hash_DRBG รักษาค่าของสถานะไว้สองค่า ได้แก่ V (ค่าที่ใช้สร้างผลลัพธ์) และ C (ค่าคงที่ที่บวกเข้าระหว่างการสร้างผลลัพธ์) การสร้างผลลัพธ์: hash_gen สร้างบิตโดยคำนวณ H(0x01 || V), H(0x01 || V+1), ... ซ้ำไปจนกว่าจะมีผลลัพธ์เพียงพอ จากนั้นอัปเดต V ด้วย V = V + H(0x03 || V) + C + reseed_counter การเติมเมล็ดใหม่: ใช้ Hash_df (ฟังก์ชันสร้างอนุพันธ์จากแฮช) โดยรวม V ปัจจุบันเข้ากับเอนโทรปีใหม่เพื่อสร้าง V และ C ค่าใหม่ Hash_DRBG นำไปใช้งานได้ตรงไปตรงมาและมีการวิเคราะห์ความปลอดภัยที่เรียบง่าย จึงเหมาะกับสภาพแวดล้อมที่มีข้อจำกัด NIST แนะนำให้เริ่มต้นด้วย SHA-256 หรือ SHA-512 Hash_DRBG ถูกใช้ใน SHA1PRNG ของ Java (รุ่นเก่า) และ DRBG รุ่นเดิมของ OpenSSL

โครงสร้าง HMAC_DRBG

HMAC_DRBG รักษาสถานะไว้เป็น (กุญแจ K และค่า V) การสร้างผลลัพธ์: คำนวณ V = HMAC(K, V) ซ้ำไปจนกว่าจะได้ผลลัพธ์เพียงพอ จากนั้นคำนวณ K = HMAC(K, V || 0x00) และ V = HMAC(K, V) การอัปเดต: รับ additional_input แล้วเติมเมล็ดใหม่ให้ K และ V โดยใช้การดำเนินการ HMAC HMAC_DRBG มีการพิสูจน์ความปลอดภัยที่ชัดเจนโดยอาศัยความปลอดภัยของ HMAC (สมมติฐาน PRF ของ HMAC) นี่คือ DRBG ที่ได้รับการแนะนำอย่างแพร่หลายที่สุด โดย OpenSSL (ตั้งแต่รุ่น 1.1.1), mbedTLS, wolfSSL และชุดโพรโทคอล TLS ส่วนใหญ่ใช้ HMAC_DRBG โครงสร้าง HMAC มีการผสมค่าระหว่างการเรียกใช้ที่ต่อเนื่องกันในตัว ทำให้การโจมตีแบบย้อนรอยทำได้ยากขึ้น แม้สถานะจะถูกเปิดเผยเพียงบางส่วน

โครงสร้าง CTR_DRBG

CTR_DRBG ใช้การเข้ารหัสแบบบล็อก (AES) ในโหมดตัวนับ สถานะประกอบด้วยกุญแจ K และตัวนับ V การสร้างผลลัพธ์: เข้ารหัสค่าตัวนับต่อเนื่องเป็น E(K, V), E(K, V+1), ... แล้วเพิ่มค่า V การอัปเดต: ใช้ Block_Cipher_df เพื่อสร้าง K และ V ค่าใหม่จาก additional_input CTR_DRBG เป็น DRBG ที่เร็วที่สุด การเร่งความเร็วด้วยฮาร์ดแวร์ AES-NI ทำให้เร็วกว่า DRBG ที่ใช้แฮชหลายลำดับขนาดในหน่วยประมวลผลสมัยใหม่ โดยเป็น DRBG เริ่มต้นใน Windows CNG (CryptGenRandom ใช้ CTR_DRBG กับ AES-256), OpenSSL 3.0 (ค่าเริ่มต้น) และตัวสร้างตัวเลขสุ่มของเคอร์เนล Linux (การเรียกระบบ getrandom) ความปลอดภัยของ CTR_DRBG อาศัยคุณสมบัติที่ AES เป็นการเปลี่ยนรูปเสมือนสุ่ม ซึ่งได้รับการสนับสนุนอย่างมากจากการวิเคราะห์เป็นเวลาหลายทศวรรษ

ความต้านทานการคาดเดาและการเติมเมล็ดใหม่

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

แหล่งเอนโทรปี: NIST SP 800-90B และ 90C

SP 800-90A ระบุอัลกอริทึม DRBG แต่ไม่ได้ระบุแหล่งเอนโทรปี SP 800-90B กำหนดข้อกำหนดสำหรับแหล่งเอนโทรปี โดยต้องจำแนกและตรวจสอบแหล่งสัญญาณรบกวนจากฮาร์ดแวร์ ต้องประเมินเอนโทรปีอย่างระมัดระวัง และต้องมีการทดสอบความสมบูรณ์เพื่อตรวจจับความล้มเหลวของแหล่งเอนโทรปี SP 800-90C ระบุวิธีรวมแหล่งเอนโทรปีเข้ากับ DRBG เพื่อสร้างตัวสร้างบิตสุ่มที่สมบูรณ์ แหล่งเอนโทรปีที่ใช้โดยทั่วไป ได้แก่ RDRAND/RDSEED ของ CPU (ตัวสร้างตัวเลขสุ่มจากฮาร์ดแวร์ ซึ่งมีใน CPU ของ Intel/AMD ตั้งแต่ปี 2012) เอนโทรปีจาก OS (/dev/urandom บน Linux และ BCryptGenRandom บน Windows) โมดูลความปลอดภัยฮาร์ดแวร์ ตัวสร้างตัวเลขสุ่มของ TPM 2.0 และสัญญาณรบกวนจากสภาพแวดล้อม (จังหวะการเข้าถึงดิสก์และความแปรปรวนของเครือข่าย) เงื่อนไขที่มีเอนโทรปีต่ำ (เครื่องเสมือนและช่วงเริ่มต้นการบูต) ต้องได้รับการจัดการเป็นพิเศษเพื่อหลีกเลี่ยงเมล็ดที่อ่อนแอ

ข้อกำหนดการรับรอง FIPS 140-3

FIPS 140-3 (มาตรฐานปัจจุบันสำหรับการตรวจสอบความถูกต้องของโมดูลการเข้ารหัส) กำหนดให้ใช้ DRBG ตาม NIST SP 800-90A สำหรับการสร้างตัวเลขสุ่มทั้งหมดภายในโมดูลที่ได้รับการรับรอง โมดูลต้องดำเนินการดังนี้: ใช้ DRBG ที่ได้รับการรับรอง (Hash, HMAC หรือ CTR) ใช้เมล็ดจากแหล่งเอนโทรปีที่ได้รับการรับรองและเป็นไปตามข้อกำหนดของ SP 800-90B ดำเนินการทดสอบตัวเองเมื่อเปิดเครื่อง (POST) เพื่อตรวจสอบการทำงานของ DRBG ใช้การทดสอบ RNG อย่างต่อเนื่อง (CRNGT) เพื่อตรวจจับความล้มเหลวของเอนโทรปีที่ค้างอยู่ที่ศูนย์หรือค้างอยู่ที่หนึ่ง และรองรับการเติมเมล็ดใหม่เมื่อแหล่งเอนโทรปีระบุว่ามีเอนโทรปีพร้อมใช้งาน โมดูลความปลอดภัยฮาร์ดแวร์ (Thales Luna, AWS CloudHSM, Utimaco) การ์ดเร่งความเร็ว TLS และอุปกรณ์เข้ารหัสเครือข่ายมักต้องใช้โมดูลที่ผ่านการตรวจสอบตาม FIPS 140-3 ซึ่งเป็นแรงผลักดันให้มีการนำ SP 800-90A มาใช้

DRBG ในระบบปฏิบัติการ

ระบบปฏิบัติการสมัยใหม่จะรักษา DRBG ระดับเคอร์เนลซึ่งตั้งต้นจากแหล่งเอนโทรปีของฮาร์ดแวร์ Linux ใช้ DRBG ที่มี ChaCha20 เป็นพื้นฐาน (ตั้งแต่เคอร์เนล 5.17 โดยแทนที่การออกแบบเดิมที่คล้าย Fortuna) และตั้งต้นจาก RDRAND, การขัดจังหวะ รวมถึงเหตุการณ์จากดิสก์และเครือข่าย /dev/urandom คืนผลลัพธ์จาก DRBG และจะไม่บล็อกเมื่อผ่านการตั้งต้นครั้งแรกแล้ว ส่วน /dev/random จะบล็อกจนกว่าจะมีเอนโทรปีเพียงพอ (เป็นพฤติกรรมแบบเดิมที่ส่วนใหญ่ถูกนำออกจากเคอร์เนลรุ่นใหม่แล้ว) ซิสเต็มคอล getrandom(2) เป็นอินเทอร์เฟซสมัยใหม่ โดยจะบล็อกเฉพาะในช่วงเริ่มบูต ก่อนที่ DRBG จะได้รับการตั้งต้น Windows ใช้ CTR_DRBG (AES-256) ใน RNG ของเคอร์เนล โดยตั้งต้นจาก TPM และเหตุการณ์ของฮาร์ดแวร์ แอปพลิเคชันควรใช้ DRBG ของระบบปฏิบัติการผ่าน API ระดับสูง แทนการตั้งต้น DRBG ของตนเองจากประทับเวลาหรือ PID

ข้อผิดพลาดที่พบบ่อยในการนำ DRBG ไปใช้งาน

ช่องโหว่ของ DRBG ที่พบในโลกจริงมักเกิดจากข้อผิดพลาดในการนำไปใช้งาน ไม่ใช่จากจุดอ่อนของอัลกอริทึม (1) การตั้งต้นไม่เพียงพอ: การตั้งต้นโดยใช้เพียงประทับเวลาปัจจุบันหรือ PID ทำให้ผู้โจมตีคาดเดาค่าเริ่มต้นได้ (2) การไม่ตระหนักถึงการ fork: เมื่อกระบวนการสร้างกระบวนการลูกด้วย fork ทั้งกระบวนการแม่และกระบวนการลูกจะแชร์สถานะ DRBG เดียวกัน จึงสร้างตัวเลขสุ่มที่เหมือนกัน วิธีแก้ไข: ตั้งต้นใหม่หลัง fork (โดยใช้ pthread_atfork หรือการเรียก getrandom อย่างชัดเจน) (3) การนำสแนปชอตของ VM กลับมาใช้ซ้ำ: หากกู้คืนสแนปชอตของ VM สถานะ DRBG จะย้อนกลับไปเป็นสถานะในสแนปชอต และสร้างผลลัพธ์ที่เคยเห็นแล้ว วิธีแก้ไข: ป้อนเอนโทรปีที่ไม่ซ้ำกันเมื่อเริ่ม VM (VIRTIO RNG) (4) การปล่อยให้การทดสอบความสมบูรณ์ล้มเหลวโดยไม่แจ้ง: DRBG ที่ยังคงสร้างผลลัพธ์ต่อหลังตรวจพบความล้มเหลวของเอนโทรปี จะให้ผลลัพธ์ที่ผู้โจมตีคาดเดาได้ (5) การนำค่าที่ใช้ครั้งเดียวกลับมาใช้ซ้ำระหว่างอินสแตนซ์ของ DRBG

แบบทดสอบการตั้งต้นใหม่ของ DRBG

การตั้งต้น DRBG ใหม่ด้วยเอนโทรปีสดให้คุณสมบัติใด

สรุป NIST SP 800-90A

NIST SP 800-90A กำหนดกลไก DRBG ที่ได้รับอนุมัติสามแบบ ได้แก่ Hash_DRBG (แฮชแบบวนซ้ำและเรียบง่าย), HMAC_DRBG (อาศัย HMAC มีการพิสูจน์ความปลอดภัยที่ชัดเจนและใช้งานอย่างแพร่หลาย) และ CTR_DRBG (โหมดตัวนับของ AES ซึ่งเร็วที่สุดเมื่อใช้ AES-NI และเป็นค่าเริ่มต้นใน Windows/OpenSSL) ทั้งสามแบบใช้วงจรการทำงาน Instantiate/Generate/Reseed ร่วมกัน โดยมีขีดจำกัด reseed_interval ที่ 2^48 ระดับความแข็งแกร่งด้านความปลอดภัย (112–256 บิต) เป็นตัวกำหนดข้อกำหนดด้านเอนโทรปี ความต้านทานการคาดเดาต้องตั้งต้นใหม่ก่อนการเรียก Generate แต่ละครั้ง FIPS 140-3 กำหนดให้ใช้ DRBG ตาม SP 800-90A ร่วมกับแหล่งเอนโทรปีตาม SP 800-90B การไม่ตระหนักถึงการ fork การนำสแนปชอตของ VM กลับมาใช้ซ้ำ และการตั้งต้นไม่เพียงพอ เป็นข้อผิดพลาดหลักในการนำไปใช้งานที่พบในโลกจริง

คำถามที่พบบ่อย

บทเรียน “NIST SP 800-90A: มาตรฐาน DRBG” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “NIST SP 800-90A: มาตรฐาน DRBG” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “NIST SP 800-90A: มาตรฐาน DRBG”

ทำความเข้าใจเฟรมเวิร์ก DRBG ของ NIST ตั้งแต่การสร้างอินสแตนซ์ การตั้งค่าเริ่มต้นใหม่ ความต้านทานการคาดการณ์ ไปจนถึงระดับความปลอดภัย คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “NIST SP 800-90A: มาตรฐาน DRBG” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม

ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. NIST SP 800-90A: มาตรฐาน DRBG
  2. รายละเอียดภายในของ Hash-DRBG, HMAC-DRBG และ CTR-DRBG
  3. เหตุการณ์แบ็กดอร์ใน Dual EC DRBG
  4. การทดสอบและตรวจสอบการนำ RNG ไปใช้
← กลับไปที่ Cryptology Academy