Odpytywanie o hasła API serwisu HaveIBeenPwned

nfsec.pl 2 tygodni temu

W

2017 roku Troy Hunt wspomniał we wpisie na blogu o usłudze umożliwiającej sprawdzenie, czy dane / nasze hasło już istnieje pośród 306 milionów haseł, które wyciekły w wyniku naruszeń różnych serwisów. Oczywiście nie zalecano podawania prawdziwego hasła ani choćby hasła w formie zahaszowanej. Rok później Junade Ali z Cloudflare zaproponował bardzo eleganckie rozwiązanie, aby móc wysyłać zapytania do usługi bez ujawniania zbyt wielu informacji.

[…] nasze podejście dodaje dodatkową warstwę bezpieczeństwa, wykorzystując matematyczną adekwatność znaną jako k-anonimowość i stosując ją do haszy haseł w postaci zapytań o zakres. W związku z tym usługa API Pwned Passwords nigdy nie uzyskuje wystarczających informacji na temat haszu hasła, które nie zostało złamane, aby móc je później złamać.

Dlatego zasada jest bardzo prosta: musimy obliczyć skrót SHA1 hasła, które chcemy sprawdzić i wysłać pierwszych pięć kawałeczków bajtów (tj. pierwszych 20 bitów) SHA1 do interfejsu API usługi. W zamian API udostępni nam wszystkie znane skróty SHA1, zaczynając od tych pięciu kawałków bajtów. Następnie wystarczy sprawdzić czy nasz cały SHA1 pojawi się na zwróconej liście, czy nie. jeżeli tak, oznacza to, iż sprawdzane hasło było częścią wcześniejszych wycieków i powinniśmy wybrać inne oraz powstrzymać się od jego dalszego używania. jeżeli usługa nie zwróciła nam dokładnego haszu to wyraźnie znając tylko 5 okruchów bajtów SHA1, żadna próba bruteforce będzie niemożliwa ze względu na ogromną liczbę kolizji między kandydatami na hasło. Przykład prostego skryptu:

#!/bin/bash if [ -n "$1" ] then hash=$(echo -n $1 | sha1sum | awk '{print $1}') echo "Hash: $hash" prefix=${hash:0:5} echo "Prefix: $prefix" suffix=${hash:5:35} echo "Suffix: $suffix" wget -q -O - https://api.pwnedpasswords.com/range/$prefix | grep -i $suffix \ || echo "Brak trafień!" else echo "Podaj hasło!" fi

Użycie:

agresor@darkstar:~$ ./check-hibp.sh Justyna123 Hash: 31cb943f69cdedf46e0da674c146fd6ac0b4958a Prefix: 31cb9 Suffix: 43f69cdedf46e0da674c146fd6ac0b4958a 43F69CDEDF46E0DA674C146FD6AC0B4958A:207

Hasło Justyna123 nie jest zbyt dobrym hasłem, ponieważ było widziane wcześniej w 207 wyciekach. Według standardu NIST zalecane jest, aby każda usługa, która odpowiedzialna jest za utworzenie konta lub zmianę hasła na danej platformie powinna sprawdzać, czy wybrane przez użytkownika hasło nie jest:

  • Na liście haseł, które wcześniej wyciekły,
  • Słowem ze słownika,
  • Zawiera znaki potwarzające się lub sekwencyjne (np. “aaaaaa”, “1234abcd”),
  • Słowo specyficzne dla kontekstu, takie jak nazwa usługi, nazwa użytkownika i ich pochodne.

Jednak jeżeli będziemy chcieli zaimplementować funkcję, która będzie generowała zapytania zaraz po wpisaniu pojedynczego znaku – należy mieć na uwadze, iż mamy około 92 możliwych znaków, w tym znaki alfanumeryczne i specjalne, a każdy znak, który został wpisy może być bardzo gwałtownie odgadnięty – bez względu na to, ile znaków będzie miało hasło. Dlatego oprócz zaufania do HaveIBeenPwned i firmy Cloudflare lepszym pomysłem, może być ściągnięcie wszystkich haszy i wystawienie własnej usługi w sieci firmowej.

Więcej informacji: HaveIBeenPwned API

Idź do oryginalnego materiału