ου γαρ εστιν κρυπτον ο ου φανερον γενησεται ουδε αποκρυφον ο ου γνωσθησεται και εις φανερον ελθη
Wersja PL ENG Version

Szyfrowanie oparte na haśle (ang. password-based encryption - PBE)

Szyfrowanie oparte na haśle to wykorzystywany powszechnie sposób tworzenia silnych kluczy kryptograficznych.

Siła szyfru zależy od siły użytego sekretnego klucza. Dobry sekretny klucz musi zawierać znaki, które nie są łatwe do odgadnięcia. Hasła wymyślane przez użytkowników są zwykle stosunkowo łatwymi do zapamiętania podzbiorami znaków ASCII lub UTF-8, wobec tego nie powinny być bezpośrednio używane do tworzenia sekretnych kluczy.

Szyfrowanie oparte na haśle umożliwia tworzenie silnych sekretnych kluczy na podstawie haseł wprowadzonych przez użytkowników. Produkowane bajty klucza są w założeniu maksymalnie losowe i nieprzewidywalne.

Algorytmy PBE pobierają jako dane wejściowe hasło użytkownika, razem z dodatkowymi parametrami:

Istnieją dwa popularne standardy, które opisują jak przekształcić bajty hasła na sekretny klucz: PKCS #5 (operujący na znakach ASCII) oraz PKCS #12 (który operuje na 16-bitowych znakach).

Oba standardy PBE są zaprojektowane w podobny sposób. Polegają one na użyciu funkcji mieszających na otrzymanych bajtach hasła użytkownika (oraz ewentualnie dodatkowych bajtach soli). Funkcje te zbudowane są bazując na bezpiecznych funkcjach haszujących, które wywoływane są pewną ilość razy (określoną przez otrzymany licznik iteracji). Po wymieszaniu danych, bajty wyjściowe z tych funkcji tworzą klucz szyfrujący (oraz wektor inicjujący, jeśli jest potrzebny).

Schemat działania algorytmów PBE
działanie algorytmów PBE

Sól (ang. salt)

Sól jest losowym numerem, który w założeniu ma przeciwdziałać atakom słownikowym. Jeśli sekretny klucz utworzony byłby bez użycia soli, ewentualny napastnik mógłby zastosować te same algorytmy PBE i przygotować klucze odpowiadające popularnym słowom, często używanym jako hasła. Dodanie losowej wartości jako wejścia do algorytmów PBE sprawia, że wynikowa kombinacja danych wejściowych staje się również losowa. Nie jest już dłużej możliwe sprawdzenie wszystkich prawdopodobnych parametrów wejściowych algorytmu PBE.

Ponieważ sól jest losowa, jest bardzo nieprawdopodobne, że taka sama wartość zostanie używa wielokrotnie, dla wielu operacji szyfrowania. Wartość soli nie jest sekretem. Może być transmitowana razem z szyfrogramem do odbiorcy.

Wartości soli są produkowane przez generatory liczb pseudolosowych. Idealnie, długość soli powinna być taka sama jak wielkość danych wyjściowych zwracanych przez funkcję haszującą.

Licznik Iteracji (ang. iteration count)

Procedura tworzenia klucza może zostać dodatkowo skomplikowana przez wykonanie funkcji algorytmu PBE wiele razy. Powoduje to, że cały proces uzyskiwania sekretnego klucza zajmuje więcej czasu. Taka sytuacja jest akceptowalna dla użytkownika, który musi uwierzytelniać się stosunkowo rzadko i nie jest zbytnio afektowany przez krótkie opóźnienia. Z drugiej strony, ewentualny napastnik przeprowadzający atak siłowy i sprawdzający tysiące potencjalnych kombinacji, miałby dużo trudniejsze zadanie ze względu na znacznie zwiększoną złożoność obliczeniową.

Podobnie jak sól, licznik iteracji może być przekazywany do odbiorcy bez potrzeby utajniania, razem z właściwym szyfrogramem.

Zalecane jest używanie 1000 lub więcej iteracji w celu uzyskania zadowalającego poziomu zabezpieczeń.