การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย
ใช้ secrets, os.urandom และตัวห่อหุ้มที่ปลอดภัยใน Python และ Node
การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
สามหมวดหมู่
ค่าทางการเข้ารหัสสามประเภทที่ต้องสร้างอย่างปลอดภัย ได้แก่ (1) คีย์ — มีอายุการใช้งานยาวนาน ต้องคาดเดาไม่ได้และต้องเก็บเป็นความลับ (2) เวกเตอร์เริ่มต้น (IV) — ใช้ต่อข้อความหนึ่งรายการ อาจเปิดเผยต่อสาธารณะได้ แต่ต้องคาดเดาไม่ได้ (CBC) หรือไม่ซ้ำกัน (GCM) (3) นอนซ์ — ต้องไม่ซ้ำกันในการใช้งานแต่ละครั้ง และอาจเป็นค่าสุ่มหรือไม่ก็ได้
คีย์สมมาตร
AES-128: secrets.token_bytes(16) AES-256: secrets.token_bytes(32) ChaCha20: secrets.token_bytes(32) ห้ามสร้างคีย์จากรหัสผ่านโดยไม่ใช้ KDF (PBKDF2/Argon2) ห้ามใช้คีย์ซ้ำกับอัลกอริทึมหรือวัตถุประสงค์ที่แตกต่างกัน
การสร้างคีย์อสมมาตร
from cryptography.hazmat.primitives.asymmetric import ec, rsa rsa_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) ec_key = ec.generate_private_key(ec.SECP256R1()) # ไลบรารีจัดการการดึงแหล่งเอนโทรปีภายในโดยอัตโนมัติ
เวกเตอร์เริ่มต้นสำหรับ AES-CBC
AES-CBC ต้องใช้เวกเตอร์เริ่มต้นแบบสุ่มอย่างสม่ำเสมอขนาด 16 ไบต์สำหรับแต่ละข้อความ ห้ามใช้เวกเตอร์เริ่มต้นซ้ำกับคีย์เดียวกัน ห้ามใช้ตัวนับเป็นเวกเตอร์เริ่มต้นในโหมด CBC ให้สร้างดังนี้: iv = os.urandom(16) เติมเวกเตอร์เริ่มต้นไว้ด้านหน้าข้อความเข้ารหัส — ไม่จำเป็นต้องเก็บเป็นความลับ แต่ต้องคาดเดาไม่ได้
นอนซ์สำหรับ AES-GCM
AES-GCM ต้องใช้นอนซ์ขนาด 96 บิตที่ไม่ซ้ำกันสำหรับคู่ (คีย์, ข้อความ) แต่ละคู่ การใช้นอนซ์ซ้ำจะทำลายความปลอดภัยของ GCM อย่างร้ายแรง: ผู้โจมตีสามารถกู้คืนคีย์ตรวจสอบความถูกต้องและปลอมแปลงข้อความได้ ใช้นอนซ์สุ่มขนาด 12 ไบต์ (ขีดจำกัดแบบวันเกิดอยู่ที่ 2^32 ข้อความ) หรือตัวนับก็ได้
นอนซ์ที่ใช้ตัวนับ
สำหรับการเข้ารหัสปริมาณมากด้วยคีย์เดียว ให้รักษาตัวนับถาวรแยกตามคีย์: nonce = counter.to_bytes(12, "big") เพิ่มค่าตัวนับหลังการเข้ารหัสแต่ละครั้ง จัดเก็บตัวนับไว้ในที่จัดเก็บถาวร เพราะการรีเซ็ตเมื่อเริ่มระบบใหม่จะทำให้เกิดการใช้นอนซ์ซ้ำ
AEAD ที่ทนต่อการใช้นอนซ์ผิด
AES-GCM-SIV และ Deoxys-II ทนต่อการใช้นอนซ์ผิด: การใช้นอนซ์ซ้ำจะลดความปลอดภัยลงเหลือระดับเดียวกับการเข้ารหัสแบบกำหนดแน่นอน (ไม่ทำให้คีย์ตรวจสอบความถูกต้องรั่วไหล) แนะนำให้ใช้เมื่อรับประกันความไม่ซ้ำของนอนซ์ได้ยาก เช่น ในระบบแบบกระจายหรือสถานการณ์ที่ระบบหยุดทำงานแล้วเริ่มใหม่
HKDF สำหรับการสร้างคีย์จากคีย์ต้นทาง
อย่าใช้วัตถุดิบคีย์ดิบโดยตรงกับหลายวัตถุประสงค์ ให้สร้างคีย์เฉพาะสำหรับแต่ละวัตถุประสงค์: from cryptography.hazmat.primitives.kdf.hkdf import HKDF. hkdf = HKDF(SHA256(), 32, salt, info=b"enc_key"). key = hkdf.derive(master_key). ใช้ info ที่แตกต่างกันสำหรับแต่ละวัตถุประสงค์
คีย์เซสชัน
สร้างคีย์เฉพาะเซสชันจากความลับร่วม (เช่น ผลลัพธ์จาก ECDH) โดยใช้ HKDF TLS 1.3 สร้างคีย์แยกสำหรับไคลเอนต์และเซิร์ฟเวอร์ ทั้งสำหรับการจับมือและข้อมูลแอปพลิเคชัน คีย์เซสชันช่วยแยกผลกระทบจากการถูกเจาะ: การรู้คีย์ของเซสชันหนึ่งจะไม่เปิดเผยข้อมูลใด ๆ ของเซสชันอื่น
การห่อหุ้มคีย์
เพื่อจัดเก็บคีย์อย่างปลอดภัย ให้ห่อคีย์นั้นด้วยคีย์เข้ารหัสคีย์ (KEK) โดยใช้ AES-KW (RFC 3394) หรือ AES-GCM คีย์ที่ถูกห่อหุ้มสามารถจัดเก็บในฐานข้อมูลหรือส่งต่อได้ ส่วน KEK จะจัดเก็บใน HSM หรือที่เก็บคีย์ที่มีฮาร์ดแวร์รองรับ (Android Keystore, Apple Secure Enclave)
รายการตรวจสอบ
ก่อนนำไปใช้งาน ให้ตรวจสอบว่า: (1) คีย์ทั้งหมดมาจาก os.urandom/secrets (2) ไม่มีคีย์หรือเวกเตอร์เริ่มต้นที่ฝังตายตัว (3) ไม่ใช้เวกเตอร์เริ่มต้นซ้ำกับคีย์เดียวกัน (4) นอนซ์ของ GCM ไม่ซ้ำกันในแต่ละข้อความ (5) กำหนดตารางการหมุนเวียนคีย์แล้ว (6) การสร้างคีย์จากคีย์ต้นทางใช้ HKDF พร้อมสตริง info ที่แตกต่างกัน
ตรวจสอบความเข้าใจ
การใช้นอนซ์ซ้ำใน AES-GCM ส่งผลอย่างไร
สรุปทบทวน
คีย์ต้องสร้างด้วยค่าสุ่มที่แท้จริง เวกเตอร์เริ่มต้นของ CBC ต้องใช้ค่าสุ่ม ส่วนนอนซ์ของ GCM ต้องไม่ซ้ำกัน ใช้ os.urandom/secrets สร้างคีย์จากคีย์ต้นทางด้วย HKDF และห่อหุ้มด้วย KEK การเข้ารหัส AEAD ที่ทนต่อการใช้นอนซ์ผิดช่วยป้องกันการใช้นอนซ์ซ้ำโดยไม่ตั้งใจ บทถัดไป: การพิสูจน์แบบไม่เปิดเผยความรู้
เรียนรู้ Cryptology Academy ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 67
- บทเรียน
- 261
คำถามที่พบบ่อย
บทเรียน “การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย”
ใช้ secrets, os.urandom และตัวห่อหุ้มที่ปลอดภัยใน Python และ Node คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความสุ่มแท้จริงกับความสุ่มเทียม
- PRNG ที่ปลอดภัยทางการเข้ารหัส
- เอนโทรปีไม่เพียงพอและข้อผิดพลาดจากคีย์อ่อนแอ
- การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย