Нужно ли хранить соль с bcrypt?


189

Javadoc bCrypt имеет этот код для того, как зашифровать пароль:

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

Чтобы проверить, совпадает ли открытый текстовый пароль с ранее хешированным, используйте метод checkpw:

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

Эти фрагменты кода подразумевают, что случайно сгенерированная соль выбрасывается. Это так, или это просто вводящий в заблуждение фрагмент кода?

Ответы:


214

Соль включена в хеш (закодирован в формате base64).

Например, в традиционных паролях Unix соль хранилась как первые два символа пароля. Остальные символы представляют значение хеш-функции. Функция проверки знает это и разбирает хеш, чтобы вернуть соль обратно.


59
Соль включена в пароль. Так что вам не нужно спасать соль.
Свапнонил Мукерджи

2
Спасибо за это. Я хотел бы, чтобы они сказали это в javadoc :) (Я посмотрел на источник и подтвердил - но я не знал, что я искал раньше)
RodeoClown

1
Спасибо - я тоже пытался это понять! Теперь мне интересно, если это хорошая идея. Есть ли преимущество / недостаток хранения соли в хеше по сравнению с ее хранением отдельно?
Адам

8
@Adam - Поскольку соль генерируется случайным образом, это означает, что вам не нужно иметь метод связи двух вещей в вашей базе данных.
RodeoClown

Я взглянул на исходный код и обнаружил, что хотя JavaDoc для аргумента соли «возможно, сгенерирован с использованием BCrypt.gensalt», я обнаружил, что вам нужно использовать метод genSalt (), иначе вы получите исключения = /
the_new_mr
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.