Upload
proidea
View
399
Download
4
Embed Size (px)
Citation preview
Dobrze posól swoje hasło
Skróty haseł w webie
Leszek Krupiński 4developers 2015
LEAFNODE
Wstęp
User credentials w web aplikacjach
OWASP Top Ten #1: Injection
#6: Sensitive Data Exposure
Rule #1: No Plain Text
Hashing
Funkcja jednokierunkowa
słoń
żaba
żyrafa
kot
pies
wąż
1
2
3
6
5
4
Skrót to nie szyfrowanie
Skrót kryptograficzny
Idealnie: funkcja różnowartościowa
Wysoka zmienność
>>> 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"
Jak używać w aplikacji
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(); }
Jak się łamie skróty?
Brute Force
Zabezpieczenia aplikacji
95 znaków 6 pozycji
735 091 890 625
Najpierw łatwe hasła
Najpopularniejsze 6-znakowe hasło?
123456
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
Atak słownikowy
Atak hybrydowy
Reverse Lookup Tables
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
Lookup Table
Wyliczone wcześniej skróty
password | hash --------------------------------------------- a | 0cc175b9c0f1b6a831c399e269772661 aa | 4124bc0a9335c27f086f24ba207a4912 aaa | 47bce5c74f589f4867dbd57e9ca9f808 aaaa | 74b87337454200d4d33f80c4663dc5e5 (...) ab | 187ef4436122d1cc2f40dc2b92f0eba0 aba | 79af87723dc295f95bdb277a61189a2a abaa | 537964105de1063e88b2fc126750d16e (...) cat | d077f244def8a70e5ea758bd8352fcd8 (...) dog | 06d80eb0c50b49a509b49f2424e8c805 (...)
Minus: rozmiar
7 znaków == 1.5 Pb
Hash chains
Space/time tradeoff
aaaaaa 0b4e7a cdadro 8b8031 umehaoRH H R
PASSWORD CANDIDATE HASH PASSWORD CANDIDATEPASSWORD CANDIDATE HASH
Funkcja redukcyjna
Przeszukiwanie
P1 H1 P2 H2 P3
dog e0d13d cat 4e85aa lion
hawk 867dbd eagle 399e26 pigeon
balltennis basket23dc29b92f0e
party event ball70e5ea33f80c
23dc29
P1 H1 P2 H2 P3
dog e0d13d cat 4e85aa lion
hawk 867dbd eagle 399e26 pigeon
balltennis basket23dc29b92f0e
party event ball70e5ea33f80c
b92f0e
P1 H1 P2 H2 P3
dog e0d13d cat 4e85aa lion
hawk 867dbd eagle 399e26 pigeon
balltennis basket23dc29b92f0e
party event ball70e5ea33f80c
7a68a0
Kolizje
P1 H1 P2 H2 P3
dog e0d13d cat 4e85aa lion
hawk 867dbd eagle 399e26 pigeon
balltennis basket23dc29b92f0e
party event ball70e5ea33f80c
Rainbow Tables
dog e0d13d
cat 4e85aa
lion d023a3
hawk 867dbd
eagle 399e26
pigeon 89f486
balltennis basket23dc29b92f0e 5b9c0f
party
event
ball 23dc29
70e5ea
33f80c tiger d023a3
sparrow 89f486
volley 5b9c0f
venue 23dc29H
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
falconR4
R4
R4
R4
Przeszukiwanie
dog e0d13d
cat 4e85aa
lion d023a3
hawk 867dbd
eagle 399e26
pigeon 89f486
balltennis basket23dc29b92f0e 5b9c0f
party
event
ball 23dc29
70e5ea
33f80c tiger d023a3
sparrow 89f486
volley 5b9c0f
venue 23dc29H
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
falconR4
R4
R4
R4
89f486 foot
70e5ea
R4
R4 leg70e5ea R3 box R4 yellowH 1043da70e5ea R2 cat H 4e85aa R3
sparrowR3 H 89f486R4 foot
chain: 71 000 storage: 64GB
Salt
md5(salt+pass)
Unikalny salt
$6dbu$acbd18db4cc2f85cedef
Podstawowa cecha: unikalność
Minimum 128 bitów
AlgorytmyMD5, SHA-1,SHA-2, SHA-256, SHA-512
Wada: szybkość
50 milionów na sekundęśredniej klasy laptop z poprzedniej generacji (GPU)
6-znakowe: 4 godziny 7-znakowe: 17 dni 8-znakowe: 4,5 roku
180 miliardów na sekundęDedykowany do łamania haseł klaster 25 GPU (2012)
6-znakowe: 4 sekundy 7-znakowe: 6 minut 8-znakowe: 10 godzin
Nie wymyślaj
str_rot13(md5(pass+sha1(salt+pass)))+md5(sha512(pass))
Lepsze algorytmy
Key stretching
Iteracja skrótu
6-znakowe: 17 minut 7-znakowe: 1 dzień 8-znakowe: 124 dni
n=1000
PBKDF2Password-Based Key Derivation Function 2
6-znakowe: 28 dni 7-znakowe: 7 lat 8-znakowe: 700 lat
bcrypt
6-znakowe: 120 dni 7-znakowe: 31 lat 8-znakowe: 3000 lat
Strojenie liczby iteracji
Ile użytkownik zniesie
Adaptacja do zmian
Alternatywa: key strengthening
$2y$10$.nIBGM87poP6dbui4ouWNe2dnQUMKFagOz.v1TVDJO63hIZ/XTWWG
Dodatkowe bezpieczeństwo: klucz symetryczny
Timing Safe Comparison
Przyszłość: obciążenie pamięci
Dobre rady
Hasła
https://xkcd.com/936/
https://diogomonica.com/posts/password-security-why-the-horse-battery-staple-is-not-correct/
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.
Pytania?