Przedstawię nieco inne podejście do tego.
Zawsze przechowuję sól zmieszaną z hasłem z solonym hasłem.
Na przykład umieszczę pierwszą połowę soli przed solonym hashem hasła, a ostatnią połowę soli po solonym haszu hasła. Aplikacja jest świadoma tego projektu, więc może pobrać te dane i uzyskać skrót hasłowy dla hasła solonego i solonego.
Moje uzasadnienie tego podejścia:
Jeśli hasło / dane skrótu zostaną naruszone i wpadną w ręce atakującego, atakujący nie będzie wiedział, na czym polega sól, patrząc na dane. W ten sposób atakujący nie może praktycznie wykonać ataku siłowego, aby uzyskać hasło pasujące do skrótu, ponieważ nie zna skrótu na początku i nie ma sposobu, aby wiedzieć, które części danych są częściami soli, lub części skrótu z solonym hasłem ( chyba że zna logikę uwierzytelniania aplikacji) ).
Jeśli skrót hasłem z solonym hasłem jest przechowywany tak, jak jest, to można przeprowadzić atak siłowy, aby uzyskać hasło, które po soleniu i skrócie generuje te same dane, co hash z solonym hasłem.
Jednak na przykład, nawet jeśli skrót hasłem z solonym hasłem był przechowywany w stanie, w jakim się znajduje, ale jest poprzedzony pojedynczym losowym bajtem, o ile osoba atakująca nie wie, że ten pierwszy bajt zostanie odrzucony, zwiększyłoby to również trudność ataku. Twoja aplikacja wiedziałaby, że powinien usunąć pierwszy bajt danych, gdy jest używany do uwierzytelnienia użytkownika.
Wniosek do tego ..
1) Nigdy nie przechowuj danych używanych przez aplikację uwierzytelniającą w jej dokładnej formie.
2) Jeśli to możliwe, zachowaj swoją logikę uwierzytelniania w tajemnicy, aby zwiększyć bezpieczeństwo.
Idź o krok dalej ..
Jeśli nie możesz zachować logiki uwierzytelniania aplikacji w tajemnicy - wiele osób wie, jak Twoje dane są przechowywane w bazie danych. Przypuśćmy, że zdecydowałeś się przechowywać mieszany hasłem z solonym hasłem razem z solą, z częścią soli poprzedzającej skrót z solonym hasłem, a reszta soli go dołącza.
Podczas generowania losowej soli możesz również losowo zdecydować, jaka część soli będzie przechowywana przed / po skrócie solonego hasła.
Na przykład generujesz losową sól 512 bajtów. Dołączasz sól do swojego hasła i uzyskujesz skrót SHA-512 swojego solonego hasła. Generujesz także losową liczbę całkowitą 200. Następnie zapisujesz pierwsze 200 bajtów soli, następnie hash z solonym hasłem, a następnie resztę soli.
Podczas uwierzytelniania hasła użytkownika aplikacja prześle ciąg znaków i przyjmie, że pierwszy 1 bajt danych jest pierwszym 1 bajtem soli, a następnie hash solony. Ta przepustka się nie powiedzie. Aplikacja będzie kontynuowana przy użyciu pierwszych 2 bajtów danych jako pierwszych 2 bajtów soli i będzie powtarzana aż do znalezienia wyniku pozytywnego po użyciu pierwszych 200 bajtów jako pierwszych 200 bajtów soli. Jeśli hasło jest niepoprawne, aplikacja będzie próbowała wszystkich permutacji, dopóki nie zostaną znalezione.
Zalety tego podejścia:
Zwiększone bezpieczeństwo - nawet jeśli znana jest logika uwierzytelniania, dokładna logika jest nieznana w czasie kompilacji. Wykonanie ataku brutalną siłą jest praktycznie niemożliwe, nawet przy znajomości dokładnej logiki. Zwiększone długości soli jeszcze bardziej zwiększą bezpieczeństwo.
Wady tego podejścia:
Ponieważ dokładna logika jest wywnioskowana w czasie wykonywania, takie podejście wymaga bardzo dużo procesora. Im dłuższa długość soli, tym bardziej wymaga to procesora.
Uwierzytelnianie niepoprawnych haseł wiąże się z najwyższym kosztem procesora. Może to przynieść efekt przeciwny do zamierzonego, ale zwiększa bezpieczeństwo przed atakującymi.
To podejście można wdrożyć na różne sposoby i może być jeszcze bardziej bezpieczne przy użyciu soli o zmiennej szerokości i / lub hashów z solonym hasłem.