คนส่วนใหญ่พบคำว่า nonce ในโปรไฟล์ VPN และคิดว่าเป็นความลับร่วมอีกตัวที่ต้องคัดลอกระหว่างคู่สัญญา ไม่ใช่เช่นนั้น nonce คือค่าที่ต้องไม่ซ้ำภายใต้คีย์เดียวกัน และในการเข้ารหัสที่อิง nonce ส่วนใหญ่ มันเดินทางแบบเปิดเผย ความสับสนยังคงไม่เป็นอันตรายจนกว่าจะมีคนแก้ไขด้วยมือ และนั่นคือจุดที่ความเสียหายจริงเริ่มต้น

nonce มาจากไหนจริง ๆ

การเข้ารหัสที่ผ่านการรับรองความถูกต้องต้องใช้ nonce ที่ต่างกันสำหรับทุกข้อความที่เข้ารหัสภายใต้คีย์ โปรโตคอลตอบสนองข้อกำหนดนี้ด้วยวิธีต่าง ๆ เช่น ตัวนับที่เพิ่มขึ้นแบบโมโนโทนิก เกลือที่รวมกับตัวระบุแพ็กเก็ต หรือค่าสุ่มที่ยาวพอ IKEv2 แลกเปลี่ยน nonce ระหว่างการแลกเปลี่ยนเริ่มต้น และค่าเหล่านี้เป็นอินพุตสาธารณะสำหรับการสร้างคีย์ ไม่ใช่ความลับ

ความเป็นเอกลักษณ์อาจเป็นเชิงโครงสร้างหรือเชิงความน่าจะเป็น ตัวนับไม่สามารถซ้ำได้จนกว่าจะวนกลับ ซึ่งเป็นเหตุผลที่โปรโตคอลกำหนดจุดเปลี่ยนคีย์ไว้ล่วงหน้าไกลมาก ค่าสุ่มอาศัยบิตที่มากพอจนการชนกันไม่น่าเกิดขึ้นภายในขีดจำกัดข้อความ ซึ่งเป็นข้อโต้แย้งที่ต่างออกไปพร้อมโหมดความล้มเหลวที่ต่างกัน เอกสารโปรโตคอลระบุว่าใช้วิธีใด และทั้งสองวิธีปลอดภัยเฉพาะเมื่อเคารพขีดจำกัดที่ระบุไว้

DesignWhere uniqueness comes fromExhaustion is handled by
AES-GCM recordsAn IV, typically a counterRekey before the counter wraps
ChaCha20-Poly1305A 96-bit nonce from a counter or generatorA message limit per key
WireGuardA per-key 64-bit counterRekey at a message cap
OpenVPN AEADPacket identifier plus implicit key materialRekey on the packet-id limit
IKEv2Fresh nonces per exchangeA new security association

การใช้ซ้ำมีต้นทุนจริงคืออะไร

การใช้ nonce ซ้ำภายใต้คีย์เดียวไม่ใช่เรื่องประสิทธิภาพเล็กน้อย ด้วย GCM ข้อความสองข้อความที่ใช้ IV ร่วมกันทำให้ผู้สังเกตสามารถกู้คีย์รับรองความถูกต้องและคำนวณเอกซ์คลูซีฟออร์ของข้อความธรรมดาทั้งสองได้ โครงสร้างที่อิงสตรีมก็ใช้คีย์สตรีมซ้ำในลักษณะเดียวกัน ซึ่งเปลี่ยนข้อความเข้ารหัสให้เป็นปริศนาแทนที่จะเป็นความลับ

นี่คือเหตุผลที่ การใช้งานจริงเปลี่ยนคีย์ก่อนที่ตัวนับจะวนกลับ และเป็นเหตุผลที่มันหยุดแทนที่จะดำเนินต่อเมื่อสถานะไม่แน่นอน การรีบูตที่รีเซ็ตตัวนับในขณะที่คู่สัญญายังถือคีย์เก่า หรือเครื่องเสมือนที่กู้คืนจากสแนปช็อตที่ถ่ายกลางเซสชัน คือสถานการณ์ที่ขีดจำกัดมีอยู่เพื่อป้องกัน ไม่ต้องมีผู้โจมตี การดำเนินงานปกติก็เพียงพอ

ทำไมการแก้ไขด้วยมือจึงเป็นวิธีแก้ที่ผิด

ตัวนับ เกลือ และตัวระบุแพ็กเก็ตเป็นเครื่องสถานะที่ทั้งสองฝั่งใช้ร่วมกัน การเปลี่ยนฝั่งหนึ่งทำให้อีกฝั่งขาดการซิงโครไนซ์ และอุโมงค์ล้มเหลวในลักษณะที่ดูเหมือนปัญหาเส้นทาง สิ่งที่รองรับคือการแลกเปลี่ยนคีย์ใหม่ ซึ่งรีเซ็ตสถานะทั้งสองฝั่งพร้อมกัน

รหัสผ่านและ nonce ก็มีบทบาทต่างกัน รหัสผ่านเป็นอินพุตที่เป็นความลับสำหรับการสร้างคีย์ ส่วน nonce เป็นอินพุตสาธารณะต่อข้อความ ฟิลด์โปรไฟล์ที่ติดป้าย nonce และขอความลับยาว ๆ มักเป็นคีย์คงที่หรือความลับที่แบ่งปันล่วงหน้าภายใต้ชื่ออื่น ดังนั้นควรอ่านเอกสารของฟิลด์นั้นแทนการสันนิษฐาน

เมื่อคำแนะนำเกี่ยวกับการจัดการ nonce การแก้ไขคือเวอร์ชันที่ผู้ดูแลแก้ไขแล้ว ไม่ใช่การเข้ารหัสอื่นหรือคีย์ที่สั้นลง การเปลี่ยนการเข้ารหัสเพื่อหลีกเลี่ยงคำว่า nonce ย้ายปัญหาแทนที่จะแก้ไข

อ่านคำเตือนโดยไม่เดา

บรรทัดบันทึกเกี่ยวกับตัวนับหรือ nonce มักอธิบายสถานะที่สูญหาย ไม่ใช่การโจมตี ตรวจสอบว่าคู่สัญญาฝั่งหนึ่งรีสตาร์ตหรือไม่ เครื่องเสมือนที่โคลนใช้ตัวตนเดิมซ้ำหรือไม่ และทั้งสองฝั่งเห็นตรงกันเรื่องการตั้งค่าการเปลี่ยนคีย์หรือไม่ จากนั้นสร้างเซสชันใหม่และดูว่าข้อความกลับมาหรือไม่

แยกการวินิจฉัยออกจากความล้มเหลวที่ไม่เกี่ยวข้อง หน้าที่โหลดไม่ได้ หรือพรอมต์ข้อมูลรับรองที่วนซ้ำ ไม่ใช่หลักฐานของการใช้ nonce ซ้ำ และการปฏิบัติต่อมันเช่นนั้นจะทำให้คุณลงไปในชั้นการเข้ารหัสในขณะที่ปัญหาอยู่เหนือชั้นนั้น

สำหรับการใช้งานทั่วไป กฎที่ปลอดภัยนั้นสั้น: ให้การใช้งานจัดการ nonce รักษาทั้งสองฝั่งไว้บนเวอร์ชันที่รองรับ และถือว่าการรีเซ็ตสถานะใด ๆ เป็นเหตุผลในการเปลี่ยนคีย์แทนการแก้ไขค่า หากฟิลด์โปรไฟล์ไม่อยู่ในเอกสารของผู้ขาย อย่าสร้างค่าขึ้นมาเอง การซ่อมอุโมงค์เริ่มจากการรู้ว่าคุณกำลังดูชั้นไหน

บทความที่เกี่ยวข้อง