Zawsze należy używać algorytmu mieszającego hasło: Argon2 , scrypt , bcrypt lub PBKDF2 .
Argon2 wygrał konkurs hashowania hasła 2015. Scrypt , bcrypt i PBKDF2 są starsze algorytmy, które są uważane za mniej korzystne teraz, ale nadal zasadniczo zdrowe, więc jeśli platforma nie obsługuje Argon2 jeszcze, to jest ok, aby użyć innego algorytmu do teraz.
Nigdy nie przechowuj hasła bezpośrednio w bazie danych. Nie szyfruj go też: w przeciwnym razie, jeśli Twoja witryna zostanie naruszona, atakujący otrzymuje klucz deszyfrujący, dzięki czemu może uzyskać wszystkie hasła. Hasła MUSZĄ zostać zakodowane .
Hash hasła ma różne właściwości z tabeli hash hash lub kryptograficzną hash. Nigdy nie używaj zwykłego skrótu kryptograficznego, takiego jak MD5, SHA-256 lub SHA-512 do hasła. Algorytm mieszania haseł wykorzystuje sól , która jest unikalna (nieużywana dla żadnego innego użytkownika ani w żadnej bazie danych). Sól jest niezbędna, aby atakujący nie mogli po prostu wstępnie obliczyć skrótów wspólnych haseł: przy użyciu soli muszą ponownie uruchomić obliczenia dla każdego konta. Algorytm mieszania hasła jest z natury powolny - tak wolny, jak tylko możesz sobie na to pozwolić. Powolność boli atakującego bardziej niż ciebie, ponieważ atakujący musi wypróbować wiele różnych haseł. Aby uzyskać więcej informacji, zobacz Jak bezpiecznie mieszać hasła .
Skrót hasła koduje cztery informacje:
- Wskaźnik tego, który algorytm jest używany. Jest to konieczne dla zwinności : zalecenia kryptograficzne zmieniają się z czasem. Musisz być w stanie przejść do nowego algorytmu.
- Wskaźnik trudności lub twardości. Im wyższa jest ta wartość, tym więcej obliczeń potrzeba do obliczenia wartości skrótu. Powinna to być stała lub globalna wartość konfiguracyjna w funkcji zmiany hasła, ale z czasem powinna rosnąć, ponieważ komputery stają się szybsze, dlatego należy pamiętać o wartości dla każdego konta. Niektóre algorytmy mają jedną wartość liczbową, inne mają więcej parametrów (na przykład do osobnego dostrajania zużycia procesora i pamięci RAM).
- Sól. Ponieważ sól musi być unikalna na całym świecie, musi być przechowywana dla każdego konta. Sól powinna być generowana losowo przy każdej zmianie hasła.
- Właściwy hash, tzn. Wynik obliczeń matematycznych w algorytmie haszującym.
Wiele bibliotek zawiera funkcje parowe, które wygodnie pakują te informacje jako pojedynczy ciąg znaków: taki, który pobiera wskaźnik algorytmu, wskaźnik twardości i hasło, generuje losową sól i zwraca pełny ciąg skrótu; oraz taki, który przyjmuje hasło i pełny ciąg hashowy jako dane wejściowe i zwraca wartość logiczną wskazującą, czy hasło było prawidłowe. Nie ma uniwersalnego standardu, ale powszechne jest kodowanie
$ Algorytm $ parametry $ sól $ wyjście
gdzie algorithm
jest liczbą lub krótkim łańcuchem alfanumerycznym kodującym wybór algorytmu, parameters
jest łańcuchem do wydruku salt
i output
jest kodowany w Base64 bez zakończenia =
.
16 bajtów wystarcza na sól i wynik. (Zobacz np. Rekomendacje dla Argon2 .) Zakodowane w Base64, każdy ma 21 znaków. Pozostałe dwie części zależą od algorytmu i parametrów, ale typowe są 20–40 znaków. To w sumie około 82 znaków ASCII ( CHAR(82)
i nie ma potrzeby Unicode), do których powinieneś dodać margines bezpieczeństwa, jeśli uważasz, że później trudno będzie powiększyć pole.
Jeśli kodujesz skrót w formacie binarnym, możesz sprowadzić go do 1 bajtu dla algorytmu, 1–4 bajtów dla twardości (jeśli kodujesz niektóre parametry) i 16 bajtów dla soli i danych wyjściowych , w sumie 37 bajtów. Powiedz 40 bajtów ( BINARY(40)
), aby mieć przynajmniej kilka wolnych bajtów. Zauważ, że są to 8-bitowe bajty, znaki niedrukowalne, w szczególności pole może zawierać bajty zerowe.
Pamiętaj, że długość skrótu jest całkowicie niezwiązana z długością hasła.