Załóżmy, że mamy przechować jakiś sekret. Nie do końca chodzi nam o to, by był on przechowywany w sposób nieodwracalny, natomiast zdecydowanie chcemy mieć możliwość sprawdzenia, czy określona osoba ten sekret zna.
Tak, dokładnie o to chodzi również przy przechowywaniu haseł. Tu absolutnym standardem jest przechowywanie sekretów (haseł) w formie skrótu (hasha), który powinien być nie tylko nieodwracalny, ale również kosztowny do wyliczenia. Wszystko po to, by atak brute force był jak najbardziej kosztowny (obliczeniowo). Są jednak takie przypadki, w których przestrzeń możliwych wartości sekretu jest na tyle niewielka, że podejście oparte na wykorzystaniu hasha po prostu się nie sprawdza.
W takich przypadkach lepszym podejściem jest zaszyfrowanie sekretu i przechowywanie go w takiej postaci. Oczywiście szyfrowanie musi być wykonane z głową, bo inaczej skutki są takie: Anatomy of a password disaster - Adobe's giant-sized cryptographic blunder.
Jeśli szyfrowanie zostanie zrealizowane poprawnie, to atak na hasła sprowadzi się do ataku na wykorzystany szyfr. W praktyce oznacza to konieczność odgadnięcia klucza, który ma co najmniej 128 bitów. Powodzenia.
Ale jednocześnie właśnie tu jest problem - system by działać, musi mieć dostęp do tego klucza. Z pewnym prawdopodobieństwem należy więc założyć, że również atakujący będzie miał do niego dostęp (choć w przypadku wspomnianej już wpadki Adobe - klucza najwyraźniej nie udało się zdobyć).
Jaki stąd morał? Warto zastanowić się co chcemy chronić i jaka jest możliwa przestrzeń wartości tego sekretu. W pewnych sytuacjach bardziej bezpiecznym rozwiązaniem będzie wybranie szyfrowania i próba utrudnienia dostępu do klucza.
P.S. W zasadzie dokładnie to samo można osiągnąć przy pomocy tajnego pepper (uzupełniając jawny salt). Oczywiście tutaj należy z kolei zadbać o to, by pepper nie był łatwo dostępny dla atakującego.
P.S2. A przypomniało mi się to w związku z tym: Can hackers decrypt Target's PIN data? Przy okazji - warto zwrócić uwagę na sztuczki zastosowane po to, by uniknąć sytuacji, w której dwa różne PIN szyfrują się do tej samej wartości (wykorzystany jest 3DES w trybie ECB).