Podstawowa funkcja szyfrowania uwierzytelnionego z danymi powiązanymi (AEAD) jest najczęściej używaną podstawową funkcją szyfrowania danych i spełnia większość potrzeb.
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 tej zmiany.
- Symetryczne: szyfrowanie tekstu jawnego i odszyfrowywanie tekstu zaszyfrowanego odbywa się przy użyciu tego samego klucza.
- Randomizacja: szyfrowanie jest randomizowane. Dwie wiadomości z tym samym tekstem jawny generują różne teksty zaszyfrowane. Hakerzy nie mogą wiedzieć, który szyfrogram odpowiada danemu tekstowi jawnemu. Jeśli chcesz tego uniknąć, użyj zamiast tego deterministycznego AEAD.
Powiązane dane
Algorytm AEAD może służyć do powiązania tekstu zaszyfrowanego z określonymi danymi powiązanymi. Załóżmy, że masz bazę danych z polami user-id i encrypted-medical-history. W tym scenariuszu user-id może być używane jako dane powiązane podczas szyfrowania encrypted-medical-history. Zapobiega to przenoszeniu historii medycznej przez atakującego z jednego konta użytkownika na inne.
Dane powiązane są opcjonalne. Jeśli zostanie określony, odszyfrowywanie powiedzie się tylko wtedy, gdy te same dane powiązane zostaną przekazane do wywołań szyfrowania i odszyfrowywania.
Wybierz typ klucza
W większości przypadków zalecamy używanie klucza AES128_GCM, ale w zależności od potrzeb możesz wybrać inny typ klucza. AES128 zapewnia 128-bitowe bezpieczeństwo, a AES256 – 256-bitowe.
Wybierając tryb, należy wziąć pod uwagę 2 główne ograniczenia dotyczące bezpieczeństwa:
- QPS: ile wiadomości jest zaszyfrowanych tym samym kluczem?
- Rozmiar wiadomości: jak duże są wiadomości?
Ogólnie:
- AES-CTR-HMAC (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256) z 16-bajtowym wektorem inicjującym (IV) to najbardziej konserwatywny tryb o dobrych granicach.
- AES-EAX (AES128_EAX, AES256_EAX) jest nieco mniej konserwatywny i nieco szybszy niż AES128_CTR_HMAC_SHA256.
- AES-GCM (AES128_GCM, AES256_GCM) jest zwykle najszybszym trybem z najbardziej rygorystycznymi limitami liczby wiadomości i ich rozmiaru. Jeśli te limity długości tekstu jawnego i powiązanych danych (poniżej) zostaną przekroczone, AES-GCM ulegnie awarii i ujawni materiał klucza.
- AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV) jest prawie tak szybki jak AES-GCM. Ma takie same limity liczby wiadomości i rozmiaru wiadomości jak AES-GCM, ale gdy te limity zostaną przekroczone, błąd jest mniej poważny: może ujawnić tylko fakt, że 2 wiadomości są identyczne. Dzięki temu jest bezpieczniejszy w użyciu niż AES-GCM, ale w praktyce jest rzadziej stosowany. Aby używać tej funkcji w Javie, musisz zainstalować Conscrypt.
- Algorytm XChaCha20-Poly1305 (XCHACHA20_POLY1305) ma znacznie większy limit liczby wiadomości i rozmiaru wiadomości niż AES-GCM, ale gdy zawodzi (co jest bardzo mało prawdopodobne), ujawnia też materiał klucza. Nie jest akcelerowany sprzętowo, więc w sytuacjach, w których akceleracja sprzętowa jest dostępna, może działać wolniej niż tryby AES.
Gwarancje bezpieczeństwa
Implementacje AEAD oferują:
- zabezpieczenia CCA2,
- Siła uwierzytelniania musi wynosić co najmniej 80 bitów.
- możliwość zaszyfrowania co najmniej 232 wiadomości o łącznym rozmiarze 250 bajtów; Żaden atak z wybranymi tekstami jawnymi lub szyfrogramami (maksymalnie 232) nie ma prawdopodobieństwa powodzenia większego niż 2-32.
Przykłady użycia
Chcę zaszyfrować dane i powiązać tekst zaszyfrowany z jego kontekstem.