Czy muszę przechowywać sól w bcrypt?

189

bCrypt's javadoc ma ten kod do szyfrowania hasła:

String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); 

Aby sprawdzić, czy hasło w postaci zwykłego tekstu jest zgodne z hasłem, które zostało wcześniej zaszyfrowane, użyj metody checkpw:

if (BCrypt.checkpw(candidate_password, stored_hash))
    System.out.println("It matches");
else
    System.out.println("It does not match");

Te fragmenty kodu sugerują mi, że losowo generowana sól jest wyrzucana. Czy tak jest, czy to tylko wprowadzający w błąd fragment kodu?

RodeoClown
źródło

Odpowiedzi:

214

Sól jest wbudowana w skrót (zakodowany w formacie base64).

Na przykład w tradycyjnych hasłach uniksowych sól była przechowywana jako pierwsze dwa znaki hasła. Pozostałe znaki reprezentują wartość skrótu. Funkcja sprawdzania wie o tym i rozdziela hash, aby odzyskać sól.

Greg Hewgill
źródło
59
Sól jest zawarta w haśle. Więc nie musisz oszczędzać soli.
Swapnonil Mukherjee
2
Dziękuję za to. Szkoda, że ​​nie powiedzieli tego w javadoc :) (spojrzałem na źródło i potwierdziłem - ale nie wiedziałem, czego szukam wcześniej)
RodeoClown
1
Dzięki - też próbowałem to rozgryźć! Teraz zastanawiam się, czy to dobry pomysł. Czy przechowywanie soli w mieszaniu jest zaletą / wadą w porównaniu z oddzielnym przechowywaniem?
Adam
8
@Adam - Ponieważ sól jest generowana losowo, oznacza to, że nie musisz mieć metody kojarzenia dwóch rzeczy w bazie danych.
RodeoClown
Rzuciłem okiem na kod źródłowy i odkryłem, że chociaż JavaDoc dla argumentu soli jest „być może generowany przy użyciu BCrypt.gensalt”, odkryłem, że musisz użyć metody genSalt (), albo dostaniesz wyjątki = /
the_new_mr