พริมิทีฟ Authenticated Encryption with Associated Data (AEAD) เป็นพริมิทีฟที่ใช้กันมากที่สุดสำหรับการเข้ารหัสข้อมูลและเหมาะกับความต้องการส่วนใหญ่
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 เล็กน้อย
- MLGR ที่ไม่ใช้ Key-Committing
- AES-GCM (AES128_GCM, AES256_GCM) มักจะเป็นโหมดที่เร็วที่สุดโดยมีขีดจำกัดที่เข้มงวดที่สุดเกี่ยวกับจำนวนข้อความ (232) และขนาดข้อความ (~64 GB ต่อข้อความ) เมื่อเกินขีดจำกัดเหล่านี้ AES-GCM จะล้มเหลวอย่างรุนแรงโดยการรั่วไหลของข้อความธรรมดาและส่วนการตรวจสอบสิทธิ์ของคีย์ภายใน AES-GCM
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) [RFC8452] ทนทานต่อการใช้ Nonce ในทางที่ผิดโดยไม่ตั้งใจ และมีประสิทธิภาพเกือบเท่ากับ AES-GCM ขีดจำกัดจำนวนข้อความและขนาดข้อความสำหรับ AES-GCM-SIV ที่มี IV แบบสุ่มจะสูงกว่าขีดจำกัดของ AES-GCM มาก เมื่อเกินขีดจำกัดเหล่านี้ AES-GCM-SIV จะล้มเหลวโดยไม่ก่อให้เกิดความเสียหายมากนัก โดยจะรั่วไหลเฉพาะข้อมูลที่ว่าข้อความ 2 ข้อความมีค่าเท่ากัน
AES-GCM-SIV มีความปลอดภัยมากกว่า แต่มีการใช้งานในทางปฏิบัติน้อยกว่า
- ขอบเขตสำหรับ Nonce แบบสุ่ม
- 232 ข้อความ โดยที่ข้อความธรรมดาแต่ละรายการมีขนาดไม่เกิน 8 GiB
- 248 ข้อความ โดยที่ข้อความธรรมดาแต่ละข้อความมีขนาดไม่เกิน 32 MiB
- 264 ข้อความ โดยที่ข้อความธรรมดาแต่ละรายการมีขนาดไม่เกิน 128 KiB
- หากต้องการใช้ใน Java ให้ติดตั้ง Conscrypt
- ADGKLS ที่ไม่ใช้ Key-Committing
- ขอบเขตสำหรับ Nonce แบบสุ่ม
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) มีขีดจำกัดจำนวนข้อความและขนาดข้อความมากกว่า AES-GCM มาก แต่เมื่อดำเนินการไม่สำเร็จ (ซึ่งไม่น่าเป็นไปได้) ก็จะทำให้ข้อมูลคีย์รั่วไหลด้วย ซึ่งไม่ได้เร่งฮาร์ดแวร์ จึงอาจช้ากว่าโหมด AES ในสถานการณ์ที่มีการเร่งฮาร์ดแวร์
- LGR ที่ไม่ใช้คีย์คอมมิตติ้ง
ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการส่งข้อมูลของข้อความเข้ารหัส AEAD
การรับประกันความปลอดภัย
การติดตั้งใช้งาน AEAD มีดังนี้
- การรักษาความปลอดภัย CCA2
- ระดับการตรวจสอบสิทธิ์อย่างน้อย 80 บิต
- ความสามารถในการเข้ารหัสข้อความอย่างน้อย 232 ข้อความที่มีขนาดรวม 250 ไบต์ ไม่มีการโจมตีด้วยข้อความธรรมดาที่เลือกหรือข้อความเข้ารหัสที่เลือกสูงสุด 232 รายการที่มีความน่าจะเป็นที่จะสำเร็จมากกว่า 2-32
ตัวอย่าง Use Case
ดูหัวข้อฉันต้องการเข้ารหัสข้อมูลและฉันต้องการเชื่อมโยงข้อความเข้ารหัสกับบริบท