=> "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
= 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.
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
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
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
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.