Phương thức gốc Mã hoá đã xác thực với dữ liệu liên kết (AEAD) là phương thức gốc phổ biến nhất để mã hoá dữ liệu và phù hợp với hầu hết các nhu cầu.
AEAD có các thuộc tính sau:
- Secrecy: Không có thông tin nào về văn bản thô được biết đến, ngoại trừ độ dài của văn bản đó.
- Tính xác thực: Không thể thay đổi văn bản thô đã mã hoá bên dưới bản mã mà không bị phát hiện.
- Đối xứng: Mã hoá văn bản thô và giải mã văn bản mật mã được thực hiện bằng cùng một khoá.
- Sắp xếp ngẫu nhiên: Mã hoá được sắp xếp ngẫu nhiên. Hai thông báo có cùng văn bản thuần tuý sẽ tạo ra các văn bản mật mã khác nhau. Kẻ tấn công không thể biết bản mã nào tương ứng với một bản rõ nhất định. Nếu bạn muốn tránh điều này, hãy sử dụng AEAD tất định.
Dữ liệu liên quan
Bạn có thể dùng AEAD để liên kết bản mã với dữ liệu liên kết cụ thể. Giả sử bạn có một cơ sở dữ liệu có các trường user-id và encrypted-medical-history. Trong trường hợp này, bạn có thể dùng user-id làm dữ liệu liên kết khi mã hoá encrypted-medical-history. Điều này ngăn kẻ tấn công di chuyển bệnh sử từ người dùng này sang người dùng khác.
Dữ liệu liên kết là không bắt buộc. Nếu được chỉ định, quá trình giải mã chỉ thành công nếu cùng một dữ liệu liên kết được truyền đến cả lệnh gọi mã hoá và giải mã.
Chọn loại chìa khoá
Mặc dù bạn nên dùng AES128_GCM cho hầu hết các trường hợp sử dụng, nhưng có nhiều loại khoá cho các nhu cầu khác nhau. AES128 cung cấp mức độ bảo mật 128 bit và AES256 cung cấp mức độ bảo mật 256 bit.
Hai quy tắc ràng buộc bảo mật đáng chú ý khi chọn một chế độ là:
- QPS: Có bao nhiêu thông báo được mã hoá bằng cùng một khoá?
- Kích thước thư: Thư có kích thước bao nhiêu?
Các loại khoá được hỗ trợ:
- AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) có Vectơ khởi tạo (IV) 16 byte là chế độ thận trọng nhất với các giới hạn phù hợp.
- Cam kết khoá.
- AES-EAX (AES128_EAX, AES256_EAX) ít bảo thủ hơn một chút và nhanh hơn một chút so với AES128_CTR_HMAC_SHA256.
- MLGR không cam kết khoá.
- AES-GCM (AES128_GCM, AES256_GCM) thường là chế độ nhanh nhất với giới hạn nghiêm ngặt nhất về số lượng thông báo (232) và kích thước thông báo (~64 GB mỗi thông báo). Khi vượt quá các giới hạn này, AES-GCM sẽ gặp lỗi nghiêm trọng do rò rỉ văn bản thuần tuý và phần xác thực của khoá nội bộ AES-GCM.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV)
[RFC8452] có khả năng chống lại việc vô tình sử dụng sai số chỉ dùng một lần và có hiệu suất gần bằng AES-GCM. Giới hạn về số lượng thông báo và kích thước thông báo cho AES-GCM-SIV có IV ngẫu nhiên cao hơn nhiều so với giới hạn của AES-GCM. Khi vượt quá các giới hạn này, AES-GCM-SIV sẽ gặp lỗi ít nghiêm trọng hơn: chỉ làm rò rỉ thông tin rằng hai thông báo bằng nhau.
AES-GCM-SIV an toàn hơn nhưng ít được sử dụng trong thực tế.
- Giới hạn cho số chỉ dùng một lần ngẫu nhiên:
- 232 thông báo, trong đó mỗi văn bản thuần tuý có kích thước tối đa là 8 GiB
- 248 thông báo, trong đó mỗi văn bản thuần tuý có kích thước tối đa là 32 MiB
- 264 thông báo, trong đó mỗi văn bản thuần tuý có kích thước tối đa là 128 KiB
- Để sử dụng trong Java, hãy cài đặt Conscrypt.
- ADGKLS không cam kết khoá.
- Giới hạn cho số chỉ dùng một lần ngẫu nhiên:
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) có giới hạn về số lượng thư và kích thước thư lớn hơn nhiều so với AES-GCM, nhưng khi không thành công (rất khó xảy ra), thuật toán này cũng làm rò rỉ dữ liệu khoá. Thuật toán này không được tăng tốc phần cứng, nên có thể chậm hơn các chế độ AES trong những trường hợp có thể tăng tốc phần cứng.
- LGR không cam kết khoá.
Tìm hiểu thêm về định dạng truyền dữ liệu của bản mã AEAD.
Đảm bảo an ninh
Các cách triển khai AEAD mang lại:
- Bảo mật CCA2.
- Độ mạnh xác thực tối thiểu là 80 bit.
- Khả năng mã hoá ít nhất 232 thông báo với tổng số 250 byte. Không có cuộc tấn công nào có tối đa 232 bản rõ đã chọn hoặc bản mã đã chọn có xác suất thành công lớn hơn 2-32.
Trường hợp sử dụng mẫu
Xem phần Tôi muốn mã hoá dữ liệu và Tôi muốn liên kết văn bản mật mã với bối cảnh của nó.