Pierwotny strumień AEAD zapewnia uwierzytelnione szyfrowanie danych strumieniowych. Jest to przydatne, gdy dane do zaszyfrowania są zbyt duże, aby przetworzyć je w jednym kroku. Typowe przypadki użycia obejmują szyfrowanie dużych plików lub strumieni danych na żywo.
Szyfrowanie odbywa się w segmentach, które są powiązane z ich lokalizacją w zaszyfrowanym tekście i nie można ich usunąć ani zmienić ich kolejności. Segmenty z jednego szyfrogramu nie mogą być wstawiane do innego szyfrogramu. Aby zmodyfikować istniejący tekst zaszyfrowany, cały strumień danych musi zostać ponownie zaszyfrowany.1
Odszyfrowywanie jest szybkie, ponieważ za każdym razem odszyfrowywane i uwierzytelniane jest tylko część tekstu zaszyfrowanego. Częściowe teksty jawne można uzyskać bez przetwarzania całego tekstu zaszyfrowanego.
Wdrożenia szyfrowania AEAD w przypadku strumieniowania spełniają definicję AEAD i są bezpieczne w przypadku NOAE. Mają one te właściwości:
- Secrecy o tekstach zwykłych wiadomo tylko ich długość.
- Authenticity nie można zmienić zaszyfrowanego tekstu szyfrowanego bez wykrycia.
- Symmetric szyfrowanie i odszyfrowywanie tekstu zwykłego odbywa się przy użyciu tego samego klucza.
- Randomizacja: szyfrowanie jest losowe. 2 wiadomości z tym samym tekstem jawnym dają różne teksty zaszyfrowane. Hakerzy nie mogą wiedzieć, który tekst zaszyfrowany odpowiada danemu tekstowi jawnemu.
Powiązane dane
Pierwotny strumień AEAD może służyć do powiązania szyfrogramu z konkretnymi powiązanymi danymi. Załóżmy, że masz bazę danych z polami user-id
i encrypted-medical-history
: w tym scenariuszu pole user-id
może być używane jako powiązane dane podczas szyfrowania pola encrypted-medical-history
. Zapobiega to przenoszeniu historii medycznej z jednego konta na drugie.
Wybieranie typu klucza
W większości przypadków zalecamy użycie AES128_GCM_HKDF_1MB. Ogólnie:
- AES-GCM-HKDF
- AES128_GCM_HKDF_1MB (lub AES256_GCM_HKDF_1MB) jest szybszą opcją. Może szyfrować 264 pliki o rozmiary do 264 bajtów każdy. Podczas procesu szyfrowania i odszyfrowywania zużywa się około 1 MB pamięci.
- AES128_GCM_HKDF_4KB zużywa około 4 KB pamięci i jest dobrym wyborem, jeśli Twój system ma mało pamięci.
- AES-CTR HMAC
- AES128_CTR_HMAC_SHA256_1MB (lub AES256_CTR_HMAC_SHA256_1MB) to bardziej zachowawcza opcja.
Gwarancje bezpieczeństwa
Streamingowe implementacje AEAD oferują:
- Zabezpieczenia CCA2.
- Siła uwierzytelniania co najmniej 80-bitowa.
- Możliwość zaszyfrowania co najmniej 264 wiadomości3 o łącznej długości 251 bajtów2 . Żadna z ataków z maksymalnie 232 wybranymi tekstami jawnymi lub zaszyfrowanymi tekstami nie ma prawdopodobieństwa powodzenia większego niż 2-32.
Przykładowy przypadek użycia
Zobacz sekcję Chcę zaszyfrować duże pliki lub strumienie danych.
-
Powodem tego ograniczenia jest użycie szyfru AES-GCM. Zaszyfrowanie innego segmentu tekstu zwykłego w tym samym miejscu byłoby równoznaczne z ponownym użyciem IV, co narusza gwarancje bezpieczeństwa AES-GCM. Kolejnym powodem jest zapobieganie atakom polegającym na przywracaniu, w których przypadku atakujący może spróbować przywrócić poprzednią wersję pliku bez wykrycia. ↩
-
Obsługiwanych jest 232 segmentów, z czym każdy segment zawiera
segment_size - tag_size
bajtów tekstu zwykłego. W przypadku segmentów o wielkości 1 MB łączny rozmiar tekstu to 232 * (220-16) ≈ 251 bajtów. ↩ -
Streaming AEAD staje się niepewny, gdy powtarza się kombinacja klucza wyprowadzonego (128-bitowego) i prefiksu nonce (niezależna losowa wartość 7-bajtowa). Mamy 184-bitową odporność na kolizje, co w przybliżeniu przekłada się na 264 wiadomości, jeśli chcemy, aby prawdopodobieństwo sukcesu było mniejsze niż 2-32. ↩