PRNG ที่ปลอดภัยทางการเข้ารหัส
สำรวจ /dev/urandom, ChaCha20-CSPRNG และ Fortuna
PRNG ที่ปลอดภัยทางการเข้ารหัส เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
สรุปทบทวนข้อกำหนดของ CSPRNG
CSPRNG ต้องมีคุณสมบัติตามข้อกำหนดต่อไปนี้: (1) การคาดเดาบิตถัดไปไม่ได้ — แม้ทราบบิตก่อนหน้าทั้งหมด ก็ไม่สามารถคาดเดาบิตถัดไปด้วยความน่าจะเป็น > 1/2 + ค่าที่เล็กมากจนละเลยได้ (2) ความต้านทานต่อการเปิดเผยสถานะ — การทราบสถานะปัจจุบันจะไม่เปิดเผยข้อมูลใด ๆ เกี่ยวกับผลลัพธ์ในอดีต
/dev/urandom และ getrandom()
Linux /dev/urandom ใช้ CSPRNG ที่ตั้งต้นจากพูลเอนโทรปี หลังจากการตั้งต้นครั้งแรก (เอนโทรปี 128 บิต) ก็สามารถใช้งานได้อย่างปลอดภัยแม้พูลจะ "ว่างเปล่า" — CSPRNG จะรักษาสถานะภายในของตนเองไว้ ส่วน getrandom() คือ system call สมัยใหม่ที่เทียบเท่ากัน
CSPRNG ที่ใช้ ChaCha20
เคอร์เนล Linux รุ่น 5.17 ขึ้นไปเปลี่ยน CSPRNG มาใช้การออกแบบที่อิง ChaCha20 โดย ChaCha20 ทำงานได้รวดเร็ว (ไม่จำเป็นต้องใช้การเร่งด้วยฮาร์ดแวร์) ให้ความปลอดภัยระดับ 256 บิต และมีการพิสูจน์ความปลอดภัยที่เป็นที่เข้าใจอย่างดี นอนซ์คือค่าตัวนับ ส่วนคีย์มาจากพูลเอนโทรปี
Fortuna
Fortuna (Ferguson และ Schneier, 2003) คือการออกแบบ CSPRNG ที่รักษาพูลเอนโทรปีไว้ 32 พูล และสะสมเอนโทรปีอย่างต่อเนื่อง ตัวสร้างจะตั้งต้นใหม่จากพูลต่าง ๆ เมื่อพูลเหล่านั้นเต็มขึ้น มีความทนทานต่อการรีเซ็ต RNG และการโจมตีที่ทำให้สถานะบางส่วนถูกเปิดเผย
ช่องโหว่ลับใน DUAL_EC_DRBG
เดิมที NIST SP 800-90A มี DUAL_EC_DRBG ซึ่งอิงเส้นโค้งวงรี เอกสารที่ Snowden เปิดเผยแสดงให้เห็นว่า NSA แทรกช่องโหว่ลับไว้ โดยเลือกจุด EC ให้ NSA สามารถคาดเดาผลลัพธ์จากค่าเริ่มต้นใด ๆ ได้ ห้ามใช้ DUAL_EC_DRBG โดยเด็ดขาด NIST ถอดอัลกอริทึมนี้ออกในปี 2014
CTR_DRBG
CTR_DRBG (NIST SP 800-90A) ใช้ AES ในโหมดตัวนับเป็น CSPRNG ค่าเริ่มต้น = คีย์ 256 บิต + นอนซ์ 128 บิต การเรียกแต่ละครั้งจะเลื่อนค่าตัวนับไปข้างหน้า มีการนำไปใช้อย่างแพร่หลายใน OpenSSL, BoringSSL และ Windows BCrypt และมีการเร่งด้วยฮาร์ดแวร์บน CPU ที่รองรับ AES-NI
HASH_DRBG และ HMAC_DRBG
HASH_DRBG ใช้ฟังก์ชันแฮช (SHA-256) ซ้ำหลายรอบร่วมกับค่าเริ่มต้น ส่วน HMAC_DRBG ใช้ HMAC สำหรับการผสมข้อมูล HMAC_DRBG นำไปใช้อย่างถูกต้องได้ง่ายกว่า และใช้ในระบบฝังตัวจำนวนมาก (mbedTLS, WolfSSL)
การตั้งต้นใหม่และการเติมเอนโทรปี
แม้แต่ CSPRNG ก็ต้องตั้งต้นใหม่เป็นระยะ CTR_DRBG มีช่วงเวลาการตั้งต้นใหม่ทุก 2^48 คำขอ Fortuna ตั้งต้นใหม่จากพูลเอนโทรปี การตั้งต้นใหม่ด้วยตนเองคือการเพิ่มเอนโทรปีใหม่ (ไบต์จาก getrandom) ลงในสถานะของ CSPRNG เมื่อเริ่มต้นระบบและหลัง fork()
ปัญหาจาก fork
เมื่อโพรเซสทำ fork ทั้งโพรเซสแม่และโพรเซสลูกจะสืบทอดสถานะ CSPRNG เดียวกัน จึงสร้างผลลัพธ์เหมือนกัน วิธีแก้คือเรียก getrandom() เพื่อตั้งต้นใหม่ทันทีหลัง fork() ในรุ่นล่าสุด OpenSSL จัดการเรื่องนี้โดยอัตโนมัติผ่าน pthread_atfork()
CSPRNG ในการใช้งานจริง: Python
import secrets key = secrets.token_bytes(32) # คีย์ 256 บิต nonce = secrets.token_bytes(12) # นอนซ์ 96 บิตสำหรับ AES-GCM pin = secrets.randbelow(10**6) # PIN 6 หลัก # ห้ามใช้โมดูล random สำหรับการเข้ารหัส
การเข้ารหัสในเบราว์เซอร์
window.crypto.getRandomValues(typedArray) คือ CSPRNG ของเบราว์เซอร์ โดยเรียกใช้แหล่งเอนโทรปีของ OS และใช้โดย WebCrypto API สำหรับสร้างคีย์ ห้ามใช้ Math.random() เพื่อความปลอดภัย — เพราะเป็น PRNG ที่ไม่ใช่การเข้ารหัสและตั้งต้นจากเวลาของระบบ
ตรวจสอบความเข้าใจ
คุณควรใช้โมดูล Python ใดเพื่อสร้างไบต์สุ่มสำหรับการเข้ารหัส
สรุปทบทวน
CSPRNG เช่น ChaCha20, CTR_DRBG และ Fortuna สามารถสร้างผลลัพธ์ที่คาดเดาไม่ได้จากค่าเริ่มต้นที่มีเอนโทรปี หลีกเลี่ยง DUAL_EC_DRBG, random.random() และ Math.random() ใช้ secrets ใน Python หรือ window.crypto ในเบราว์เซอร์ บทถัดไป: ความล้มเหลวของเอนโทรปีในโลกจริง
คำถามที่พบบ่อย
บทเรียน “PRNG ที่ปลอดภัยทางการเข้ารหัส” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “PRNG ที่ปลอดภัยทางการเข้ารหัส” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “PRNG ที่ปลอดภัยทางการเข้ารหัส”
สำรวจ /dev/urandom, ChaCha20-CSPRNG และ Fortuna คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “PRNG ที่ปลอดภัยทางการเข้ารหัส” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความสุ่มแท้จริงกับความสุ่มเทียม
- PRNG ที่ปลอดภัยทางการเข้ารหัส
- เอนโทรปีไม่เพียงพอและข้อผิดพลาดจากคีย์อ่อนแอ
- การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย