Element podstawowy szyfrowania uwierzytelnionego z danymi powiązanymi (AEAD) jest najczęstszym elementem podstawowym do szyfrowania danych i jest odpowiedni do większości potrzeb.
AEAD ma te właściwości:
- Secrecy o tekście jawnym nie wiadomo nic oprócz jego długości.
- Autentyczność: nie można zmienić zaszyfrowanego tekstu jawnego, który stanowi podstawę tekstu szyfrowanego, bez wykrycia tej zmiany.
- Symetryczne: szyfrowanie tekstu jawnego i odszyfrowywanie tekstu szyfrowanego odbywa się za pomocą tego samego klucza.
- Randomization (Randomizacja): szyfrowanie jest losowe. Dwie wiadomości z tym samym tekstem jawnym dają różne teksty szyfrowane. Atakujący nie mogą wiedzieć, który tekst szyfrowany odpowiada danemu tekstowi jawnemu. Jeśli chcesz tego uniknąć, użyj deterministycznego AEAD.
Powiązane dane
Szyfrowanie AEAD może służyć do powiązania tekstu szyfrowanego z określonymi powiązanymi danymi. Załóżmy, że masz bazę danych z polami user-id i encrypted-medical-history. W tym scenariuszu user-id może być używany jako powiązane dane podczas szyfrowania encrypted-medical-history. Dzięki temu atakujący nie może przenieść historii medycznej od jednego użytkownika do drugiego.
Powiązane dane są opcjonalne. Jeśli zostanie określona, odszyfrowywanie powiedzie się tylko wtedy, gdy te same powiązane dane zostaną przekazane zarówno do wywołania szyfrowania, jak i odszyfrowywania.
Wybierz typ klucza
W większości przypadków zalecamy AES128_GCM, ale dostępne są różne typy kluczy do różnych potrzeb. AES128 zapewnia 128-bitowe zabezpieczenia, a AES256 – 256-bitowe.
Podczas wybierania trybu należy wziąć pod uwagę 2 istotne ograniczenia dotyczące bezpieczeństwa:
- QPS: ile wiadomości jest zaszyfrowanych tym samym kluczem?
- Rozmiar wiadomości: jak duże są wiadomości?
Obsługiwane typy kluczy:
- AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) z 16-bajtowym wektorem inicjującym (IV) to najbardziej konserwatywny tryb z dobrymi granicami.
- Zatwierdzanie klucza.
- AES-EAX (AES128_EAX, AES256_EAX) jest nieco mniej konserwatywny i nieco szybszy niż AES128_CTR_HMAC_SHA256.
- Nie jest to klucz zatwierdzający MLGR.
- AES-GCM (AES128_GCM, AES256_GCM) to zwykle najszybszy tryb z najbardziej rygorystycznymi limitami liczby wiadomości (232) i rozmiaru wiadomości (~64 GB na wiadomość). Po przekroczeniu tych limitów AES-GCM ulega awarii, co powoduje wyciek zwykłego tekstu i części uwierzytelniającej klucza wewnętrznego AES-GCM.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) [RFC8452] jest odporny na przypadkowe nadużycie liczby jednorazowej i jest prawie tak samo wydajny jak AES-GCM. Limity liczby wiadomości i rozmiaru wiadomości dla AES-GCM-SIV z losowymi wektorami IV są znacznie wyższe niż limity AES-GCM. Po przekroczeniu tych limitów AES-GCM-SIV nie zawodzi całkowicie: ujawnia tylko, że 2 wiadomości są takie same.
AES-GCM-SIV jest bezpieczniejszy, ale rzadziej używany w praktyce.
- Granice losowych liczb jednorazowych:
- 232 wiadomości, gdzie każdy tekst jawny ma maksymalnie 8 GiB.
- 248 wiadomości, gdzie każdy zwykły tekst ma maksymalnie 32 MiB.
- 264 wiadomości, w których każdy tekst jawny ma maksymalnie 128 KiB.
- Aby używać go w języku Java, zainstaluj Conscrypt.
- Niepowiązany z kluczem ADGKLS.
- Granice losowych liczb jednorazowych:
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) ma znacznie większy limit liczby wiadomości i rozmiaru wiadomości niż AES-GCM, ale gdy nie działa (co jest bardzo mało prawdopodobne), powoduje też wyciek materiału klucza. Nie jest przyspieszany sprzętowo, więc może być wolniejszy niż tryby AES w sytuacjach, gdy dostępna jest akceleracja sprzętowa.
- LGR bez klucza.
Dowiedz się więcej o formacie przesyłania tekstu szyfrowanego AEAD.
Gwarancje bezpieczeństwa
Implementacje AEAD zapewniają:
- Zabezpieczenia CCA2.
- Siła uwierzytelniania co najmniej 80 bitów.
- Możliwość zaszyfrowania co najmniej 232 wiadomości o łącznym rozmiarze 250 bajtów. Żaden atak z użyciem maksymalnie 232 wybranych tekstów jawnych lub wybranych tekstów zaszyfrowanych nie ma prawdopodobieństwa powodzenia większego niż 2-32.
Przykłady użycia
Zobacz Chcę zaszyfrować dane i Chcę powiązać tekst szyfrowany z jego kontekstem.