Cryptology Academy · บทเรียน

การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย

ใช้ secrets, os.urandom และตัวห่อหุ้มที่ปลอดภัยใน Python และ Node

บทเรียน 4 จาก 413 ขั้นตอน

การสร้างคีย์ นอนซ์ และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ความสุ่มแท้จริงกับความสุ่มเทียม
  2. PRNG ที่ปลอดภัยทางการเข้ารหัส
  3. เอนโทรปีไม่เพียงพอและข้อผิดพลาดจากคีย์อ่อนแอ
  4. การสร้างคีย์ นอนซ์ และ IV อย่างปลอดภัย
← กลับไปที่ Cryptology Academy