การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ
ทำความเข้าใจว่าการใช้ nonce ซ้ำใน GCM และโหมดอื่น ๆ อาจทำลายความลับของข้อความเข้ารหัสได้อย่างสิ้นเชิง
การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
จุดประสงค์ของค่าที่ใช้ครั้งเดียวในวิทยาการเข้ารหัสลับ
ค่าที่ใช้ครั้งเดียว (หมายเลขที่ใช้ครั้งเดียว) ทำให้การเข้ารหัสข้อความต้นฉบับเดียวกันสองครั้งสร้างข้อความเข้ารหัสที่แตกต่างกัน ซึ่งจำเป็นต่อความปลอดภัยเชิงความหมาย เพราะผู้โจมตีที่สังเกตข้อความเข้ารหัสหลายรายการจะไม่สามารถทราบได้ว่าข้อความเหล่านั้นเข้ารหัสข้อความต้นฉบับเดียวกันหรือต่างกัน ในการเข้ารหัสแบบกระแสข้อมูลและการเข้ารหัสแบบบล็อกโหมด CTR ค่าที่ใช้ครั้งเดียวจะเป็นค่าเริ่มต้นสำหรับการสร้างกระแสกุญแจ จึงมีความสำคัญอย่างยิ่งต่อความปลอดภัย
ค่าที่ใช้ครั้งเดียวของ GCM ในฐานะการเริ่มต้นตัวนับ
ในการเข้ารหัสตามมาตรฐานการเข้ารหัสขั้นสูง-GCM ค่าที่ใช้ครั้งเดียวขนาด 96 บิตจะใช้เริ่มต้นตัวนับสำหรับการเข้ารหัสโหมด CTR และยังมีส่วนในการคำนวณการยืนยันความถูกต้องด้วย GHASH ค่าตัวนับของแต่ละบล็อกการเข้ารหัสได้มาจากการเพิ่มค่าต่อเนื่องจากค่าที่ใช้ครั้งเดียว หากการเข้ารหัสสองครั้งใช้ค่าที่ใช้ครั้งเดียวและกุญแจเดียวกัน การเข้ารหัสจะสร้างกระแสกุญแจเดียวกัน ทำให้ XOR ของข้อความเข้ารหัสทั้งสองเท่ากับ XOR ของข้อความต้นฉบับทั้งสอง
ผลร้ายแรงของการใช้ค่าที่ใช้ครั้งเดียวซ้ำใน GCM
ข้อความเข้ารหัส GCM สองรายการที่เข้ารหัสด้วยคู่กุญแจและค่าที่ใช้ครั้งเดียวเดียวกันจะมี XOR เท่ากับ XOR ของข้อความต้นฉบับ หากผู้โจมตีรู้ข้อความต้นฉบับหนึ่งรายการ ซึ่งพบได้บ่อยในสถานการณ์ที่ผู้โจมตีเลือกข้อความต้นฉบับ ผู้โจมตีก็จะกู้คืนอีกรายการได้ทันที แม้ไม่รู้ข้อความต้นฉบับ XOR ของข้อความเข้ารหัสก็ยังเผยรูปแบบทางภาษา และอาจถูกโจมตีด้วยเทคนิคเลื่อนคำใบ้ได้ นี่เป็นหนึ่งในรูปแบบการใช้งานวิทยาการเข้ารหัสลับผิดวิธีที่ก่อความเสียหายร้ายแรงที่สุด
การกู้คืนกุญแจยืนยันความถูกต้องจากการใช้ค่าที่ใช้ครั้งเดียวซ้ำ
การใช้ค่าที่ใช้ครั้งเดียวซ้ำใน GCM มีผลร้ายแรงเพิ่มเติมนอกเหนือจากการกู้คืนข้อความต้นฉบับ กุญแจยืนยันความถูกต้อง GHASH หรือ H ได้มาจากกุญแจเข้ารหัสเพียงอย่างเดียว หากข้อความสองรายการใช้คู่กุญแจและค่าที่ใช้ครั้งเดียวเดียวกัน ผู้โจมตีจะสามารถแก้สมการพหุนามเพื่อกู้คืน H ได้ เมื่อรู้ H แล้ว ผู้โจมตีจะสร้างแท็กยืนยันความถูกต้อง GCM ที่ถูกต้องสำหรับข้อความเข้ารหัสใด ๆ ก็ได้ ทำให้ความถูกต้องสมบูรณ์ของข้อความถูกทำลายโดยสิ้นเชิง
การสร้างค่าที่ใช้ครั้งเดียวใน TLS 1.3
TLS 1.3 เรียนรู้จากความเสี่ยงของการใช้ค่าที่ใช้ครั้งเดียวซ้ำในการนำ TLS 1.2 ไปใช้งาน TLS 1.3 สร้างค่าที่ใช้ครั้งเดียวของ GCM โดยทำ XOR ระหว่างเวกเตอร์เริ่มต้นสำหรับการส่งข้อมูลขนาด 12 ไบต์ ซึ่งได้มาจากการจับมือ กับหมายเลขลำดับขนาด 8 ไบต์ที่ขยายศูนย์จนมีขนาด 12 ไบต์ เนื่องจากหมายเลขลำดับเพิ่มขึ้นในทุกระเบียน แต่ละระเบียนจึงใช้ค่าที่ใช้ครั้งเดียวไม่ซ้ำกัน วิธีนี้กำจัดความเสี่ยงจากการสร้างค่าที่ใช้ครั้งเดียวแบบสุ่ม พร้อมรับรองความไม่ซ้ำกันผ่านกลไกหมายเลขลำดับ
ภาพรวมการโจมตีแบบเล่นซ้ำ
การโจมตีแบบเล่นซ้ำจะดักจับข้อความหรือโทเค็นยืนยันตัวตนที่ถูกต้อง แล้วส่งซ้ำในภายหลังเพื่อให้เกิดผลอย่างฉ้อโกง ตัวอย่างเช่น ส่งธุรกรรมธนาคารซ้ำเพื่อเรียกเก็บเงินสองครั้ง ส่งการตอบกลับยืนยันตัวตนที่ถูกต้องซ้ำเพื่อปลอมเป็นผู้ใช้ หรือส่งคำสั่งที่ลงลายมือชื่อแล้วไปยังอุปกรณ์ซ้ำ ผู้โจมตีไม่จำเป็นต้องเข้าใจหรือแก้ไขข้อความ เพียงส่งข้อมูลที่ดักจับได้ซ้ำก็ทำให้การโจมตีสำเร็จ
ประทับเวลาเพื่อป้องกันการเล่นซ้ำ
การใส่ประทับเวลาในข้อความที่ยืนยันความถูกต้องแล้วช่วยป้องกันการเล่นซ้ำ ผู้รับจะยอมรับข้อความเฉพาะเมื่ออยู่ภายในช่วงเวลาสั้น ๆ เช่น 5 นาทีจากประทับเวลาที่ระบุ ข้อความที่นำมาเล่นซ้ำจากหลายชั่วโมงก่อนจะอยู่นอกช่วงเวลาและถูกปฏิเสธ ประทับเวลาต้องได้รับการยืนยันความถูกต้องด้วย โดยอยู่ภายในรหัสตรวจสอบข้อความแบบแฮชหรือข้อมูลเพิ่มเติมของ AEAD เพื่อป้องกันผู้โจมตีแก้ไขให้ดูเหมือนเป็นข้อความใหม่
หมายเลขลำดับเพื่อป้องกันการเล่นซ้ำ
หมายเลขลำดับให้การป้องกันการเล่นซ้ำที่แข็งแกร่งกว่าประทับเวลา เพราะตรวจจับได้ไม่เพียงการเล่นซ้ำของข้อความเก่า แต่ยังรวมถึงการส่งซ้ำและการส่งมาถึงนอกลำดับด้วย ผู้รับจะเก็บหมายเลขลำดับถัดไปที่คาดหมายและหน้าต่างเลื่อนของหมายเลขที่พบล่าสุดไว้ แต่ละข้อความต้องมีหมายเลขลำดับอยู่ภายในช่วงที่ยอมรับได้และต้องไม่เคยพบมาก่อน TLS ใช้หมายเลขลำดับเพื่อป้องกันการเล่นซ้ำของระเบียนภายในเซสชัน
การสร้างค่าที่ใช้ครั้งเดียวอย่างปลอดภัย
สำหรับ GCM กลยุทธ์ที่แนะนำในการสร้างค่าที่ใช้ครั้งเดียวแบบสุ่มคือใช้ตัวสร้างตัวเลขเทียมแบบสุ่มที่ปลอดภัยทางการเข้ารหัส (CSPRNG) สร้างค่าขนาด 96 บิต ด้วยค่าที่ใช้ครั้งเดียวแบบสุ่มขนาด 96 บิต ความน่าจะเป็นที่เกิดการชนตามขอบเขตแบบวันเกิดจะถึง 2^-32 หลังการเข้ารหัส 2^32 ครั้ง (ประมาณ 4 พันล้านครั้ง) สำหรับแอปพลิเคชันที่มีปริมาณงานสูง ให้เปลี่ยนไปใช้ค่าที่ใช้ครั้งเดียวแบบตัวนับ หรือใช้ AEAD อื่น เช่น ChaCha20 แบบขยาย-โพลี1305 ที่มีค่าที่ใช้ครั้งเดียวขนาด 192 บิต เพื่อขยายขีดจำกัดที่ปลอดภัย
ค่าที่ใช้ครั้งเดียวแบบกำหนดแน่นอน: การจัดการตัวนับ
ค่าที่ใช้ครั้งเดียวแบบตัวนับที่กำหนดแน่นอนช่วยหลีกเลี่ยงปัญหาขอบเขตแบบวันเกิด แต่ต้องจัดการสถานะอย่างรอบคอบ ตัวนับต้องถูกเก็บรักษาไว้แม้แอปพลิเคชันจะเริ่มทำงานใหม่ หากตัวนับกลับไปเป็นศูนย์เมื่อเริ่มทำงานใหม่ จะทำให้เกิดการใช้ค่าที่ใช้ครั้งเดียวซ้ำกับกุญแจเดิมทันที ต้องปรับปรุงตัวนับแบบอะตอมิกก่อนนำค่าที่ใช้ครั้งเดียวไปใช้ ไม่ใช่หลังจากนั้น สำหรับระบบแบบกระจาย ค่าที่ใช้ครั้งเดียวแบบตัวนับต้องมีการประสานงานเพื่อป้องกันไม่ให้โหนดสองโหนดใช้ค่าตัวนับเดียวกัน
ChaCha20 แบบขยาย-โพลี1305 สำหรับค่าที่ใช้ครั้งเดียวยาวกว่า
ChaCha20 แบบขยาย-โพลี1305 ขยายค่าที่ใช้ครั้งเดียวของ ChaCha20-โพลี1305 จาก 96 เป็น 192 บิต ด้วยค่าที่ใช้ครั้งเดียวแบบสุ่มขนาด 192 บิต ความน่าจะเป็นที่เกิดการชนตามขอบเขตแบบวันเกิดจะเล็กน้อยจนละเลยได้ แม้เข้ารหัสไปแล้ว 2^96 ครั้ง ซึ่งเป็นจำนวนข้อความที่มหาศาลเกินประมาณ วิธีนี้ทำให้การสร้างค่าที่ใช้ครั้งเดียวแบบสุ่มปลอดภัยโดยไม่ต้องกังวลเรื่องขอบเขตแบบวันเกิดในทางปฏิบัติ ไลบรารีลิบโซเดียมใช้ฟังก์ชันกล่องความลับเข้ารหัสที่อาศัยการเข้ารหัสซัลซา20 แบบขยาย-โพลี1305 และใช้ค่าที่ใช้ครั้งเดียวขนาด 192 บิตด้วยเหตุผลเดียวกัน
ผลของการใช้ค่าที่ใช้ครั้งเดียวซ้ำใน GCM
หากข้อความเข้ารหัส GCM สองรายการถูกสร้างขึ้นโดยใช้กุญแจและค่าที่ใช้ครั้งเดียวเดียวกัน ผู้โจมตีจะกู้คืนสิ่งใดได้บ้าง
สรุปค่าที่ใช้ครั้งเดียวและการโจมตีแบบเล่นซ้ำ
สรุปการใช้ค่าที่ใช้ครั้งเดียวซ้ำ: ค่าที่ใช้ครั้งเดียวทำให้ข้อความเข้ารหัสไม่ซ้ำกัน การใช้ค่าที่ใช้ครั้งเดียวซ้ำใน GCM เผย XOR ของข้อความต้นฉบับและทำลายการยืนยันความถูกต้องผ่านการกู้คืน H TLS 1.3 ใช้การทำ XOR ระหว่างหมายเลขลำดับกับเวกเตอร์เริ่มต้นเพื่อรับรองว่าค่าที่ใช้ครั้งเดียวไม่ซ้ำกัน การโจมตีแบบเล่นซ้ำคือการส่งข้อความที่ถูกต้องซ้ำโดยไม่แก้ไข ประทับเวลาและหมายเลขลำดับในข้อความที่ยืนยันความถูกต้องแล้วช่วยป้องกันการเล่นซ้ำ สำหรับ GCM ให้ใช้ค่าที่ใช้ครั้งเดียวแบบสุ่มขนาด 96 บิต โดยคำนึงถึงขอบเขตแบบวันเกิด หรือใช้ ChaCha20 แบบขยายเพื่อให้มีพื้นที่ค่าที่ใช้ครั้งเดียวแบบสุ่มขนาดใหญ่ขึ้น
เรียนรู้ Cryptology Academy ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 67
- บทเรียน
- 261
คำถามที่พบบ่อย
บทเรียน “การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ”
ทำความเข้าใจว่าการใช้ nonce ซ้ำใน GCM และโหมดอื่น ๆ อาจทำลายความลับของข้อความเข้ารหัสได้อย่างสิ้นเชิง คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การโจมตี Padding Oracle โดยละเอียด
- การโจมตีแบบเล่นซ้ำและช่องโหว่จากการใช้ Nonce ซ้ำ
- การโจมตีจับเวลาในโค้ดระดับแอปพลิเคชัน
- รูปแบบการใช้งานการเข้ารหัสที่ผิดพลาดที่พบบ่อย