Artykuł Cody Hale „Jak bezpiecznie przechowywać hasło” twierdzi, że:
bcrypt ma wbudowane sole, aby zapobiec atakom na tęczowy stół.
Cytuje ten artykuł , który mówi, że w implementacji OpenBSD bcrypt
:
OpenBSD generuje 128-bitową sól bcrypt ze strumienia klucza arcfour (arc4random (3)), zaszczepionego losowymi danymi zbieranymi przez jądro z taktowania urządzenia.
Nie rozumiem, jak to może działać. W mojej koncepcji soli:
- Musi być inny dla każdego przechowywanego hasła, aby dla każdego trzeba było wygenerować osobną tęczową tabelę
- Musi być gdzieś przechowywany, aby był powtarzalny: gdy użytkownik próbuje się zalogować, podejmujemy próbę podania hasła, powtarzamy tę samą procedurę „salt and and hash”, którą wykonaliśmy, kiedy pierwotnie zapisaliśmy jego hasło, i porównujemy
Kiedy używam Devise (menedżera logowania do Railsów) z bcryptem, w bazie danych nie ma kolumny soli, więc jestem zdezorientowany. Jeśli sól jest losowa i nigdzie nie jest przechowywana, jak możemy w wiarygodny sposób powtórzyć proces mieszania?
Krótko mówiąc, w jaki sposób bcrypt może mieć wbudowane sole ?
"OrpheanBeholderScryDoubt"
Uważam, że to zdanie powinno być sformułowane w następujący sposób:
Samo
bcrypt
narzędzie nie wydaje się utrzymywać listy soli. Przeciwnie, sole są generowane losowo i dołączane do wyniku funkcji, aby były później zapamiętywane (zgodnie z implementacją Javabcrypt
). Innymi słowy, „skrót” generowany przezbcrypt
to nie tylko skrót. Jest to raczej skrót i sól połączona.źródło
Bcrypt
dodaje losową sól „akd2! *”, co skutkuje „fooakd2! *”, który jest mieszany i zapisywany. Później próbuję zalogować się przy użyciu hasła „bar”. Aby sprawdzić, czy mam rację, musi haszować „barakd2! *”. Jeśli sól została wygenerowana losowo na początek, skąd wie, jak dodać ją z powrotem do „paska” przed mieszaniem i porównywaniem?bcrypt
umie odzyskać sól z wygenerowanego wyjścia (które jest przechowywane w bazie danych). Kiedy przychodzi czas na uwierzytelnienie,bcrypt
dzieli oryginalne dane wyjściowe na składniki hash i salt. Komponent soli jest stosowany do hasła przychodzącego wpisanego przez użytkownika.Aby wszystko było jeszcze jaśniejsze,
Rejestracja / Kierunek logowania ->
Hasło + sól jest szyfrowane kluczem generowanym z: kosztu, soli i hasła. nazywamy to zaszyfrowaną wartością
cipher text
. następnie dołączamy sól do tej wartości i kodujemy ją za pomocą base64. dołączenie do niego kosztu i jest to wytworzony ciąg zbcrypt
:$2a$COST$BASE64
Ta wartość jest ostatecznie przechowywana.
Co musiałby zrobić atakujący, aby znaleźć hasło? (inny kierunek <-)
W przypadku, gdy atakujący przejmie kontrolę nad bazą danych, atakujący łatwo zdekoduje wartość base64, a następnie będzie mógł zobaczyć sól. sól nie jest tajemnicą. chociaż jest losowy. Następnie będzie musiał odszyfrować
cipher text
.Co ważniejsze: w tym procesie nie ma nic wspólnego, a raczej kosztowne szyfrowanie procesora - deszyfrowanie. dlatego tabele tęczy są tutaj mniej odpowiednie.
źródło
Pochodzi z dokumentacji interfejsu PasswordEncoder firmy Spring Security,
Co oznacza, że trzeba będzie dopasować rawPassword, które użytkownik wprowadzi ponownie przy następnym logowaniu i dopasuje je do hasła zakodowanego w Bcrypt, które jest przechowywane w bazie danych podczas poprzedniego logowania / rejestracji.
źródło