Нужно ли хранить соль с 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");

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

RodeoClown
источник

Ответы:

214

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

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

Грег Хьюгилл
источник
59
Соль включена в пароль. Так что вам не нужно спасать соль.
Свапнонил Мукерджи
2
Спасибо за это. Я хотел бы, чтобы они сказали это в javadoc :) (Я посмотрел на источник и подтвердил - но я не знал, что я искал раньше)
RodeoClown
1
Спасибо - я тоже пытался это понять! Теперь мне интересно, если это хорошая идея. Есть ли преимущество / недостаток хранения соли в хеше по сравнению с ее хранением отдельно?
Адам
8
@Adam - Поскольку соль генерируется случайным образом, это означает, что вам не нужно иметь метод связи двух вещей в вашей базе данных.
RodeoClown
Я взглянул на исходный код и обнаружил, что хотя JavaDoc для аргумента соли «возможно, сгенерирован с использованием BCrypt.gensalt», я обнаружил, что вам нужно использовать метод genSalt (), иначе вы получите исключения = /
the_new_mr