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 ai biết gì về văn bản thô, 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 thuần tuý được mã hoá làm cơ sở cho văn bản mã hoá mà không bị phát hiện.
- Đối xứng: Quá trình mã hoá văn bản thuần tuý và giải mã văn bản mã hoá được thực hiện bằng cùng một khoá.
- Ngẫu nhiên hoá: Quá trình mã hoá được ngẫu nhiên hoá. 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ã hoá khác nhau. Kẻ tấn công không thể biết văn bản mã hoá nào tương ứng với một văn bản thuần tuý nhất định. Nếu bạn muốn tránh điều này, hãy sử dụng AEAD có tính xác định.
Dữ liệu liên quan
AEAD có thể được dùng để liên kết văn bản mã hoá với dữ liệu được liên kết cụ thể. Giả sử bạn có một cơ sở dữ liệu với các trường user-id và encrypted-medical-history. Trong trường hợp này, user-id có thể được dùng làm dữ liệu được liên kết khi mã hoá encrypted-medical-history. Điều này ngăn chặn kẻ tấn công di chuyển nhật ký y tế từ người dùng này sang người dùng khác.
Bạn không bắt buộc phải cung cấp dữ liệu liên kết. 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 được liên kết được truyền đến cả lệnh gọi mã hoá và giải mã.
Chọn loại 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 hạn chế 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?
Nói chung:
- AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) với một vectơ khởi tạo (IV) 16 byte là chế độ thận trọng nhất với các ranh giới tốt.
- 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.
- 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 và kích thước thông báo. Khi vượt quá các giới hạn này về độ dài văn bản thuần tuý và dữ liệu được liên kết (bên dưới), AES-GCM sẽ gặp lỗi nghiêm trọng và làm lộ nội dung khoá.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) có tốc độ gần bằng AES-GCM. Nó có cùng giới hạn với AES-GCM về số lượng thư và kích thước thư, nhưng khi vượt quá các giới hạn này, nó sẽ thất bại theo cách ít nghiêm trọng hơn: nó có thể chỉ tiết lộ rằng hai thư bằng nhau. Điều này giúp việc sử dụng an toàn hơn so với AES-GCM, nhưng ít được sử dụng rộng rãi trong thực tế. Để sử dụng tính năng này trong Java, bạn phải cài đặt Conscrypt.
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) có giới hạn lớn hơn nhiều về số lượng thư và kích thước thư so với AES-GCM, nhưng khi thất bại (rất khó xảy ra), nó cũng làm lộ khoá. Chế độ 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 trường hợp có sẵn tính năng tăng tốc phần cứng.
Đảm bảo về bảo mật
Các cách triển khai AEAD mang lại:
- Bảo mật CCA2.
- Độ mạnh của chế độ xác thực ít nhất là 80 bit.
- Có thể mã hoá ít nhất 232 thư với tổng dung lượng là 250 byte. Không có cuộc tấn công nào với tối đa 232 văn bản gốc hoặc văn bản mã hoá được chọn có xác suất thành công lớn hơn 2-32.
Ví dụ về các trường hợp sử dụng
Xem Tôi muốn mã hoá dữ liệu và tôi muốn liên kết văn bản mã hoá với ngữ cảnh của văn bản đó.