"Twoje hasło musi zawierać duże i małe litery, cyfrę, znak specjalny" 🤔
Tylko wg tego algorytmu, to jest MOCNE hasło: Banan1!
A to jest ultra słabe: ananasnapizzyjestsuper
Jeśli nie skusisz się na liczenie entropii, to warto przynajmniej sprawdzać hasła użytkowników z bazą wycieków 🧵 ↓
Choć drugie hasło jest oczywiście świętokradztwem dla Włochów, to jednak matematycznie jest ono bardziej złożone od pierwszego, więc zakładając naiwny atak siłowy (znak po znaku), jego użycie będzie bezpieczniejsze.
Jednak zestaw reguł zmusi nas do użycia słabszego hasła.
Serwis HaveIBeenPwned udostępnia API PwnedPasswords, które pozwala sprawdzić, czy dane hasło pojawia się w znanych wyciekach danych.
Baza zawiera setki milionów skompromitowanych haseł z realnych ataków.
I możesz to wdrożyć w swoim serwisie w bezpieczny sposób.
"Ale jak mam wysłać hasło użytkownika do zewnętrznego API? To przecież niebezpieczne!"
Właśnie nie musisz.
API działa na zasadzie k-anonymity - nie wysyłasz pełnego hasła ani nawet pełnego hasha. Wysyłasz tylko fragment.
Jak to działa krok po kroku:
1. Haszujesz hasło algorytmem SHA-1
2. Bierzesz tylko 5 pierwszych znaków hasha
3. Wysyłasz te 5 znaków do API
4. Dostajesz listę wszystkich haszy zaczynających się od tych 5 znaków
5. Lokalnie sprawdzasz, czy pełny hash jest na liście
Przykład praktyczny:
echo -n "Zaq12wsx" | sha1
Wynik:
ba036d99c58a0bd2ebbc14d62e12abbabcca3143
Teraz bierzemy tylko 5 pierwszych znaków: ba036
Wysyłamy zapytanie do API:
curl -s api.pwnedpasswords.com/range/ba036
API zwraca listę setek haszy, które zaczynają się od "BA036", razem z liczbą wystąpień w wyciekach.
W odpowiedzi znajdujemy:
D99C58A0BD2EBBC14D62E12ABBABCCA3143:403122
To reszta naszego hasha (bez 5 pierwszych znaków) + liczba wystąpień.
Ponad 403 tysiące kont używało tego hasła w wyciekach.
Hasło jest skrajnie słabe.
Dlaczego to bezpieczne?
Hash SHA-1 ma 40 znaków. Wysyłasz tylko 5.
Na podstawie 5 znaków nie da się odtworzyć 40-znakowego hasha. API dostaje za mało informacji, żeby poznać twoje hasło. Ryzyko korzystania z API jest więc niewielkie.
API zwraca średnio kilkaset haszy na każde zapytanie.
Jeśli ktoś przechwytuje ruch, widzi tylko, że sprawdzasz "coś" co zaczyna się od BA036. Nie wie które hasło z tych kilkuset jest Twoje.
Poza tym, jeśli będzie ono na liście wycieków, to go nie użyjesz - prawda? ;)
Gdzie można to wdrożyć?
• Rejestracja nowych użytkowników
• Zmiana hasła
• Logowanie (opcjonalnie wymuszenie zmiany)
Nie musi to być jedyna warstwa weryfikacji. Może być np. druga warstwa po tym, co już używasz - długość, znaki specjalne itp.
API jest darmowe i bez limitów.
Spróbuj wdrożyć to w swoim serwisie. To dosłownie kilkanaście linijek kodu, które mogą uchronić użytkowników przed kompromitacją konta.
Ze znanych projektów, np. Nextcloud korzysta z tego API (o ile to aktywujesz w ustawieniach).