Podstawowy algorytm uwierzytelnionego szyfrowania z powiązanymi danymi (AEAD) jest najczęściej używanym algorytmem do szyfrowania danych i sprawdza się w większości przypadków.
AEAD ma te właściwości:
- Secrecy: o tekście jawnym nie wiadomo nic poza jego długością.
- Autentyczność: nie można zmienić zaszyfrowanego tekstu jawnego , który jest podstawą tekstu zaszyfrowanego, bez wykrycia.
- Symetryczność: szyfrowanie tekstu jawnego i odszyfrowywanie tekstu zaszyfrowanego odbywa się za pomocą tego samego klucza.
- Randomizacja: szyfrowanie jest randomizowane. Dwie wiadomości z tym samym tekstem jawnym dają różne teksty zaszyfrowane. Osoby atakujące nie mogą wiedzieć, który tekst zaszyfrowany odpowiada danemu tekstowi jawnemu. Jeśli chcesz tego uniknąć, użyj deterministycznego algorytmu AEAD zamiast tego.
Powiązane dane
Algorytm AEAD można użyć do powiązania tekstu zaszyfrowanego z określonymi powiązanymi
danymi. Załóżmy, że masz bazę danych z polami user-id i encrypted-medical-history. W takim przypadku podczas szyfrowania pola encrypted-medical-history można użyć pola user-id jako powiązanych danych. Uniemożliwia to osobie atakującej przeniesienie historii medycznej z jednego użytkownika na drugiego.
Powiązane dane są opcjonalne. Jeśli je określisz, odszyfrowanie się powiedzie tylko wtedy, gdy te same powiązane dane zostaną przekazane do wywołań szyfrowania i odszyfrowywania.
Wybierz typ klucza
W większości przypadków zalecamy używanie AES128_GCM, ale w zależności od potrzeb dostępne są różne typy kluczy. AES128 zapewnia 128-bitowe zabezpieczenia, a AES256 – 256-bitowe.
Podczas wybierania trybu należy wziąć pod uwagę 2 ważne ograniczenia dotyczące bezpieczeństwa:
- QPS: ile wiadomości jest szyfrowanych za pomocą tego samego klucza?
- 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 ograniczeniami.
- Key-committing.
- AES-EAX (AES128_EAX, AES256_EAX) jest nieco mniej konserwatywny i nieco szybszy niż AES128_CTR_HMAC_SHA256.
- Nie jest to key-committing MLGR.
- AES-GCM (AES128_GCM, AES256_GCM) jest zwykle najszybszym trybem z najściślejszymi limitami liczby wiadomości (232) i rozmiaru wiadomości (ok. 64 GB na wiadomość). Po przekroczeniu tych limitów AES-GCM ulega katastrofalnemu awarii, ujawniając tekst jawny i część uwierzytelniającą klucza wewnętrznego AES-GCM.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV)
[RFC8452] jest odporny na przypadkowe
niewłaściwe użycie nonce i jest prawie tak wydajny jak AES-GCM. Limity liczby wiadomości i rozmiaru wiadomości w przypadku AES-GCM-SIV z losowymi wektorami inicjującymi są znacznie wyższe niż w przypadku AES-GCM. Po przekroczeniu tych limitów AES-GCM-SIV
ulega mniej katastrofalnej awarii: ujawnia tylko, że
2 wiadomości są równe.
AES-GCM-SIV jest bezpieczniejszy w użyciu, ale w praktyce jest rzadziej stosowany.
- Limity losowych nonce:
- 232 wiadomości, w których każdy tekst jawny ma maksymalnie 8 GiB.
- 248 wiadomości, w których każdy tekst jawny ma maksymalnie 32 MiB.
- 264 wiadomości, w których każdy tekst jawny ma maksymalnie 128 KiB.
- Aby używać go w Javie, zainstaluj Conscrypt.
- Nie jest to key-committing ADGKLS.
- Limity losowych nonce:
- XChaCha20-Poly1305 (XCHACHA20_POLY1305) ma znacznie wyższy limit liczby wiadomości i rozmiaru wiadomości niż AES-GCM, ale gdy ulegnie awarii (co jest bardzo mało prawdopodobne), ujawnia też materiał klucza. Nie jest akcelerowany sprzętowo, więc w sytuacjach, w których dostępna jest akceleracja sprzętowa, może być wolniejszy niż tryby AES.
- Nie jest to key-committing LGR.
Dowiedz się więcej o formacie przesyłania tekstu zaszyfrowanego AEAD.
Gwarancje bezpieczeństwa
Implementacje AEAD oferują:
- zabezpieczenia CCA2,
- co najmniej 80-bitową siłę uwierzytelniania,
- możliwość zaszyfrowania co najmniej 232 wiadomości o łącznej długości 250 bajtów. Żaden atak z maksymalnie 232 wybranymi tekstami jawnymi lub wybranymi tekstami zaszyfrowanymi nie ma prawdopodobieństwa powodzenia większego niż 2-32.
Przykłady użycia
Zobacz Chcę zaszyfrować dane i powiązać tekst zaszyfrowany z jego kontekstem.