Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dobrze posól swoje hasło (z notatkami)

Dobrze posól swoje hasło (z notatkami)

Skróty haseł w webie

Leszek Krupiński

April 20, 2015
Tweet

More Decks by Leszek Krupiński

Other Decks in Programming

Transcript

  1. LEAFNODE * Konsulting - architektura, wydajność, bezpieczeństwo * PHPers, WebClusters

    - prezentacje workflow, architektura, wydajność, narzędzia * Facebook: PHPers, PHPers:Jobs
  2. Wstęp Włamanie na serwer to tylko kwestia czasu. Z różnych

    przyczyn - od nudy przez podpadnięcie komuś po wartościowe zasoby
  3. >>>  sha1('Quick  brown  fox  jumps  over  the  lazy  dog')  

    =>  "4ba0c2b764daf33a75f06e4ce4dfdce283aa9a9c"   >>>  sha1('Quick  brown  fox  jumps  over  The  lazy  dog')   =>  “c47983041ddb867c60790f93f681d74fc971ff47"   >>>  decbin(ord('T'))   =>  "1010100"   >>>  decbin(ord('t'))   =>  "1110100" Przy zmianie pojedynczego bitu całkowita zmiana wyniku
  4. username = Request->get('username'); password = Request->get('password'); hash = md5(password); user

    = Repository->getUser(username, hash); if (user) { this->status = LOGGED_IN; return; } else { throw new BadPasswordException(); } Serwer nie przechowuje oryginalnego hasła. Do logowania nie musi znać oryginalnej postaci.
  5. razem: ~900k user=pass: 5022 user=pass lowercase: 6721 pass zawiera username:

    30782 1234: 4172 12345: 3517 123456: 2954 1234567: 161 12345678: 267 123456789: 409 1234567890: 158 same cyfry: 97259 Przykładowa analiza ~900k haseł
  6. czy md5(“jabłko”) jest na liście? … czy md5(“gruszka”) jest na

    liście? … czy md5(“banan”) jest na liście? … czy md5(“pomarańcza”) jest na liście? … czy md5(“arbuz”) jest na liście? … czy md5(“brzoskwinia”) jest na liście? … nie tak (użytkownik “janek”) nie tak (użytkownicy “zosia”, “franek”) tak (użytkownik “marek”) nie
  7. password | hash --------------------------------------------- a | 0cc175b9c0f1b6a831c399e269772661 aa | 4124bc0a9335c27f086f24ba207a4912

    aaa | 47bce5c74f589f4867dbd57e9ca9f808 aaaa | 74b87337454200d4d33f80c4663dc5e5 (...) ab | 187ef4436122d1cc2f40dc2b92f0eba0 aba | 79af87723dc295f95bdb277a61189a2a abaa | 537964105de1063e88b2fc126750d16e (...) cat | d077f244def8a70e5ea758bd8352fcd8 (...) dog | 06d80eb0c50b49a509b49f2424e8c805 (...)
  8. aaaaaa 0b4e7a cdadro 8b8031 umehao R H H R PASSWORD

    CANDIDATE HASH PASSWORD CANDIDATE PASSWORD CANDIDATE HASH
  9. Funkcja redukcyjna * kiepska: ostatnie 6 znaków hashu * dobra:

    baza słów[pierwsze 64 bity % słów w bazie]
  10. P 1 H 1 P 2 H 2 P 3

    dog e0d13d cat 4e85aa lion hawk 867dbd eagle 399e26 pigeon ball tennis basket 23dc29 b92f0e party event ball 70e5ea 33f80c 23dc29
  11. P 1 H 1 P 2 H 2 P 3

    dog e0d13d cat 4e85aa lion hawk 867dbd eagle 399e26 pigeon ball tennis basket 23dc29 b92f0e party event ball 70e5ea 33f80c b92f0e
  12. P 1 H 1 P 2 H 2 P 3

    dog e0d13d cat 4e85aa lion hawk 867dbd eagle 399e26 pigeon ball tennis basket 23dc29 b92f0e party event ball 70e5ea 33f80c 7a68a0
  13. P 1 H 1 P 2 H 2 P 3

    dog e0d13d cat 4e85aa lion hawk 867dbd eagle 399e26 pigeon ball tennis basket 23dc29 b92f0e party event ball 70e5ea 33f80c
  14. dog e0d13d cat 4e85aa lion d023a3 hawk 867dbd eagle 399e26

    pigeon 89f486 ball tennis basket 23dc29 b92f0e 5b9c0f party event ball 23dc29 70e5ea 33f80c tiger d023a3 sparrow 89f486 volley 5b9c0f venue 23dc29 H H H H H H H H H H H H H H H H R1 R1 R1 R1 R2 R2 R2 R2 R3 R3 R3 R3 base foot room falcon R4 R4 R4 R4
  15. dog e0d13d cat 4e85aa lion d023a3 hawk 867dbd eagle 399e26

    pigeon 89f486 ball tennis basket 23dc29 b92f0e 5b9c0f party event ball 23dc29 70e5ea 33f80c tiger d023a3 sparrow 89f486 volley 5b9c0f venue 23dc29 H H H H H H H H H H H H H H H H R1 R1 R1 R1 R2 R2 R2 R2 R3 R3 R3 R3 base foot room falcon R4 R4 R4 R4 89f486 foot 70e5ea R4 R4 leg 70e5ea R3 box R4 yellow H 1043da 70e5ea R2 cat H 4e85aa R3 sparrow R3 H 89f486 R4 foot
  16. Unikalny salt * salt powinien być przechowywany razem z hasłem

    * nie musi być tajny - bo nie to stanowi jego cel * używając tej samej soli do wszystkich haseł można wygenerować dedykowane rainbow tables
  17. Podstawowa cecha: unikalność * brak możliwości wpływu na wygenerowany seed

    przez atakującego * CSPRNG: potencjalny DoS * PHP: mcrypt_create_iv + MCRYPT_DEV_URANDOM
  18. 180 miliardów na sekundę Dedykowany do łamania haseł klaster 25

    GPU (2012) Moc obliczeniową można wynajmować na godziny.
  19. 6-znakowe: 17 minut 7-znakowe: 1 dzień 8-znakowe: 124 dni n=1000

    Ale to teoria - naiwną iterację można zrównoleglić, zwłaszcza przy użyciu dedykowanego sprzętu, i całkowicie znieść zalety iteracji
  20. https://xkcd.com/936/ Zamiast “niby” trudnych haseł (które faktycznie są proste do

    złamania) lepiej użyć losowych, bzdurnych zlepków słów.
  21. Używaj długich, łatwych do zapamiętania haseł. Nie przechowuj haseł plain-text.

    Używaj salt. Salt ma być indywidualny. Salt ma być losowy. Salt ma być długi. Nie używaj dziwnych funkcji skrótu. Używaj iteracyjnych, dedykowanych algorytmów skrótu. Używaj bezpiecznego porównywania ciągów. Wymuszaj politykę haseł na użytkownikach, ale nie przesadzaj. Zmieniaj hasła. Nie używaj tego samego hasła w wielu serwisach. Rozważ zastosowanie biblioteki do generowania skrótu. Z czasem zwiększaj liczbę iteracji. Miej plan awaryjny.