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) มักจะเป็นโหมดที่เร็วที่สุดและมีข้อจำกัดที่เข้มงวดที่สุดเกี่ยวกับจำนวนข้อความ (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 ที่ไม่ผูกมัดคีย์
- ขอบเขตสำหรับ Nonce แบบสุ่ม:
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) มีขีดจำกัดของจำนวนข้อความและขนาดข้อความสูงกว่า AES-GCM มาก แต่เมื่อล้มเหลว (ซึ่งเกิดขึ้นได้ยากมาก) ก็จะรั่วไหลข้อมูลคีย์ด้วย เนื่องจากไม่มีการเร่งฮาร์ดแวร์ จึงอาจช้ากว่าโหมด AES ในสถานการณ์ที่มีการเร่งฮาร์ดแวร์
- LGR ที่ไม่ผูกมัดคีย์
ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการส่งข้อมูลผ่านสายของข้อความที่เข้ารหัส AEAD
การรับประกันความปลอดภัย
การติดตั้งใช้งาน AEAD มีสิ่งต่อไปนี้
- การรักษาความปลอดภัย CCA2
- ระดับการตรวจสอบสิทธิ์อย่างน้อย 80 บิต
- ความสามารถในการเข้ารหัสข้อความอย่างน้อย 232 รายการที่มีขนาดรวม 250 ไบต์ ไม่มีการโจมตีด้วยข้อความธรรมดาหรือข้อความที่เข้ารหัสที่เลือกไว้ไม่เกิน 232 รายการที่มีความน่าจะเป็นที่จะสำเร็จมากกว่า 2-32
ตัวอย่าง Use Case
ดูฉันต้องการเข้ารหัสข้อมูลและฉันต้องการเชื่อมโยงข้อความเข้ารหัสกับ บริบทของข้อความ