Primitive การเข้ารหัสที่ผ่านการรับรองพร้อมข้อมูลที่เชื่อมโยง (AEAD) เป็น Primitive ที่พบบ่อยที่สุดสำหรับการเข้ารหัสข้อมูลและเหมาะกับความต้องการส่วนใหญ่
AEAD มีคุณสมบัติดังนี้
- Secrecy: ไม่ทราบข้อมูลใดๆ เกี่ยวกับข้อความธรรมดา ยกเว้นความยาว
- ความถูกต้อง: ไม่สามารถเปลี่ยนแปลงข้อความธรรมดาที่เข้ารหัส ซึ่งอยู่ภายใต้ข้อความที่เข้ารหัสโดยไม่ถูกตรวจพบ
- สมมาตร: การเข้ารหัสข้อความธรรมดาและการถอดรหัสข้อความที่เข้ารหัสจะ ดำเนินการด้วยคีย์เดียวกัน
- การสุ่ม: การเข้ารหัสจะสุ่ม ข้อความ 2 รายการที่มีข้อความธรรมดาเหมือนกันจะให้ข้อความที่เข้ารหัสแตกต่างกัน ผู้โจมตีไม่สามารถทราบได้ว่าข้อความที่เข้ารหัสใดตรงกับข้อความธรรมดาที่กำหนด หากต้องการหลีกเลี่ยงปัญหานี้ ให้ใช้ AEAD ที่กำหนดได้แทน
ข้อมูลที่เกี่ยวข้อง
AEAD สามารถใช้เพื่อเชื่อมโยงข้อความที่เข้ารหัสกับข้อมูลที่เชื่อมโยงที่เฉพาะเจาะจง สมมติว่าคุณมีฐานข้อมูลที่มีฟิลด์ user-id
และ encrypted-medical-history ในสถานการณ์นี้ สามารถใช้ user-id เป็น
ข้อมูลที่เชื่อมโยงเมื่อเข้ารหัส encrypted-medical-history ซึ่งจะป้องกันไม่ให้
ผู้โจมตีย้ายประวัติทางการแพทย์จากผู้ใช้รายหนึ่งไปยังอีกรายหนึ่ง
ข้อมูลที่เชื่อมโยงเป็นเพียงตัวเลือก หากระบุไว้ การถอดรหัสจะสำเร็จก็ต่อเมื่อมีการส่งข้อมูลที่เชื่อมโยงเดียวกันไปยังทั้งการเรียกใช้การเข้ารหัสและการถอดรหัส
เลือกประเภทคีย์
แม้ว่าเราจะแนะนำให้ใช้ AES128_GCM สำหรับการใช้งานส่วนใหญ่ แต่ก็มีคีย์หลายประเภทสำหรับความต้องการที่แตกต่างกัน AES128 มีการรักษาความปลอดภัยแบบ 128 บิต และ AES256 มีการรักษาความปลอดภัยแบบ 256 บิต
ข้อจำกัดด้านความปลอดภัยที่สำคัญ 2 ประการเมื่อเลือกโหมดมีดังนี้
- QPS: มีการเข้ารหัสข้อความด้วยคีย์เดียวกันกี่ข้อความ
- ขนาดข้อความ: ข้อความมีขนาดเท่าใด
โดยทั่วไป
- AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) ที่มีเวกเตอร์เริ่มต้น (IV) ขนาด 16 ไบต์ เป็นโหมดที่ปลอดภัยที่สุดและมีขอบเขตที่ดี
- AES-EAX (AES128_EAX, AES256_EAX) มีความปลอดภัยน้อยกว่าเล็กน้อยและเร็วกว่า AES128_CTR_HMAC_SHA256 เล็กน้อย
- โดยปกติแล้ว AES-GCM (AES128_GCM, AES256_GCM) จะเป็นโหมดที่เร็วที่สุดและมี ข้อจำกัดที่เข้มงวดที่สุดเกี่ยวกับจำนวนข้อความและขนาดข้อความ เมื่อความยาวของข้อความธรรมดาและข้อมูลที่เกี่ยวข้อง (ด้านล่าง) เกินขีดจำกัดเหล่านี้ AES-GCM จะทำงานล้มเหลวอย่างรุนแรงและทำให้ข้อมูลคีย์รั่วไหล
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) เร็วเกือบเท่า AES-GCM โดยมีข้อจำกัดเช่นเดียวกับ AES-GCM ในเรื่องจำนวนข้อความและขนาดข้อความ แต่เมื่อเกินขีดจำกัดเหล่านี้ ระบบจะทำงานล้มเหลวในลักษณะที่ร้ายแรงน้อยกว่า นั่นคืออาจเปิดเผยเพียงข้อเท็จจริงที่ว่าข้อความ 2 รายการเท่ากัน ซึ่งทำให้ปลอดภัยกว่าการใช้ AES-GCM แต่ในทางปฏิบัติแล้วมีการใช้น้อยกว่า หากต้องการใช้ ฟีเจอร์นี้ใน Java คุณต้องติดตั้ง Conscrypt
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) มีขีดจำกัดด้าน จำนวนข้อความและขนาดข้อความมากกว่า AES-GCM มาก แต่เมื่อเกิดข้อผิดพลาด (ซึ่งมีโอกาสน้อยมาก) ก็จะทำให้ข้อมูลคีย์รั่วไหลด้วย เนื่องจากไม่ได้ใช้การเร่งฮาร์ดแวร์ จึงอาจช้ากว่าโหมด AES ในกรณีที่ใช้การเร่งฮาร์ดแวร์ ได้
การรับประกันด้านความปลอดภัย
การติดตั้งใช้งาน AEAD มีข้อดีดังนี้
- การรักษาความปลอดภัย CCA2
- ระดับการตรวจสอบสิทธิ์อย่างน้อย 80 บิต
- ความสามารถในการเข้ารหัสข้อความอย่างน้อย 232 รายการที่มีขนาดรวม 250 ไบต์ ไม่มีการโจมตีที่มีข้อความธรรมดาหรือข้อความที่เข้ารหัสที่เลือกไว้สูงสุด 232 รายการ หรือข้อความที่เข้ารหัสที่เลือกไว้ซึ่งมีโอกาสสำเร็จมากกว่า 2-32
ตัวอย่าง Use Case
ดูว่าฉันต้องการเข้ารหัสข้อมูลและต้องการเชื่อมโยงข้อความที่เข้ารหัสกับ บริบทของข้อความ