Uwierzytelnianie uwierzytelnione za pomocą powiązanych danych (AEAD)

Podstawowa funkcja szyfrowania uwierzytelnionego z danymi powiązanymi (AEAD) jest najczęściej używaną podstawową funkcją szyfrowania danych i spełnia większość potrzeb.

Szyfrowanie 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ę za pomocą 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 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-idencrypted-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, odszyfrowanie powiedzie się tylko wtedy, gdy te same dane powiązane zostaną przekazane do wywołań funkcji szyfrowania i odszyfrowywania.

Wybierz typ klucza

Większości użytkowników zalecamy używanie klucza AES128_GCM, ale w zależności od potrzeb dostępne są różne typy kluczy. AES128 zapewnia 128-bitowe bezpieczeństwo, a AES256 – 256-bitowe.

Wybierając tryb, należy wziąć pod uwagę 2 główne ograniczenia związane z bezpieczeństwem:

  1. QPS: ile wiadomości jest zaszyfrowanych tym samym kluczem?
  2. 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.
  • 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, algorytm AES-GCM ulegnie poważnej awarii, ponieważ wyciekną tekst jawny i część uwierzytelniająca wewnętrznego klucza AES-GCM.
    • AES-GCM nie jest odporny [ABN] ani nie zapewnia bezpieczeństwa klucza [GLR]. Można wygenerować tekst zaszyfrowany, który można odszyfrować za pomocą 2 różnych kluczy. Może to prowadzić do praktycznych ataków [DGRW]. Jeśli klucz zostanie wybrany przez przeciwnika, dokładnie sprawdź model zagrożeń.
  • 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 po przekroczeniu tych limitów działa w mniej katastrofalny sposób: może ujawnić tylko fakt, że 2 wiadomości są równe. 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.

Dowiedz się więcej o formacie przesyłania tekstu zaszyfrowanego AEAD.

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ć danepowiązać tekst zaszyfrowany z jego kontekstem.