Bezpieczne przechowywanie haseł to jeden z fundamentów bezpieczeństwa każdej aplikacji webowej. Mimo że temat może wydawać się dobrze znany, to błędy w implementacji wciąż zdarzają się zaskakująco często. W tym artykule przyjrzymy się bliżej funkcjom skrótu, ich ewolucji oraz aktualnym rekomendacjom OWASP.
Dlaczego algorytmy funkcji skrótu?
Dlaczego używamy funkcji skrótu do przechowywania haseł
Przechowywanie haseł w formie jawnej (tzw. „plain text”) to kardynalny błąd, który może prowadzić do katastrofalnych skutków w przypadku wycieku danych. Funkcje skrótu pozwalają na przekształcenie hasła w unikalny, stałej długości ciąg znaków, którego nie da się łatwo odwrócić. Zastosowanie funkcji skrótu zapewnia:
- Bezpieczeństwo: Nawet w przypadku wycieku bazy danych, przechowywane skróty są trudniejsze do wykorzystania przez atakujących.
- Uniwersalność: Funkcje skrótu mogą być używane niezależnie od długości hasła.
- Efektywność: Operacje na funkcjach skrótu są szybkie i stosunkowo mało zasobożerne.
Jednak nie wszystkie funkcje skrótu nadają się do przechowywania haseł. Kluczowym wymaganiem jest odporność na ataki brute-force i rainbow tables. Dlatego wybór odpowiedniej funkcji skrótu ma krytyczne znaczenie.
Chronologiczny rozwój algorytmów funkcji skrótu
- MD5 (1991)
- Na początku uznawany za szybki i bezpieczny.
- Już w 1996 roku wykryto pierwsze poważne słabości kryptograficzne.
- Obecnie MD5 jest uznawany za zbyt słaby i niezalecany do jakichkolwiek zastosowań bezpieczeństwa.
- SHA-1 (1995)
- Przez wiele lat stanowił standard w kryptografii.
- W 2005 roku odkryto pierwsze podatności.
- W 2017 roku pokazano praktyczny atak na SHA-1, co ostatecznie wykluczyło ten algorytm z bezpiecznego użycia.
- SHA-256 i SHA-3
- SHA-256 (należy do rodziny SHA-2) został wprowadzony w 2001 roku jako bezpieczniejsza alternatywa dla SHA-1.
- SHA-3 został ogłoszony w 2015 roku i oferuje dodatkowe mechanizmy ochrony, jednak ze względu na brak znaczących podatności w SHA-256, jest stosowany rzadziej.
- Algorytmy dedykowane do haseł
- W miarę jak zrozumiano, że uniwersalne funkcje skrótu (np. MD5, SHA-1) nie są optymalne dla haseł, zaczęto rozwijać algorytmy takie jak bcrypt, scrypt czy Argon2.
Aktualne rekomendacje OWASP
OWASP (Open Web Application Security Project) jest jednym z najważniejszych źródeł najlepszych praktyk w dziedzinie bezpieczeństwa aplikacji. Według aktualnych rekomendacji, zalecane algorytmy do przechowywania haseł to:
Argon2
- Wybrany jako zwycięzca konkursu Password Hashing Competition (PHC) w 2015 roku.
- Posiada trzy warianty: Argon2d (odporny na ataki GPU), Argon2i (odporny na ataki side-channel) i Argon2id (hybryda obu).
- Jest aktualnie uznawany za najbezpieczniejszy algorytm do przechowywania haseł.
scrypt
- Wprowadzony w 2009 roku, zaprojektowany tak, aby było kosztowne nie tylko obliczeniowo, ale także pamięciowo.
- Dzięki temu trudniej go zaimplementować w układach ASIC, co utrudnia ataki brute-force.
- Według OWASP powinien być drugim wyborem, tylko jeśli z Argon2 nie może być użyty z przyczyn od nas niezależnych
bcrypt
- Powstał w 1999 roku i od tego czasu jest szeroko stosowany.
- Wykorzystuje adaptacyjną funkcję skrótu, co oznacza, że można regulować jego koszt obliczeniowy.
- Według OWASP nadal dopuszczalny w systemach legacy
- Nie powinien być wybierany dla nowych systemów
Dobre praktyki
- Używaj soli (salt): Każde hasło powinno być hashowane z unikalnym losowym salt, aby zapobiec atakom rainbow tables.
- Ustaw odpowiedni koszt obliczeniowy: Zarówno bcrypt, scrypt, jak i Argon2 pozwalają na regulację kosztu obliczeniowego. Powinien on być na tyle wysoki, aby utrudnić ataki brute-force, ale jednocześnie akceptowalny dla użytkownika.
- Regularnie aktualizuj algorytm: Monitoruj rekomendacje OWASP i w miarę potrzeby migruj na bezpieczniejsze algorytmy.
Bezpieczne przechowywanie haseł to nie tylko wybór odpowiedniego algorytmu, ale także jego prawidłowa implementacja. Stosuj się do najlepszych praktyk i unikaj skrótów, które mogą narazić Twoją aplikację na poważne ryzyko.