- При регистрации юзер вводит некий пароль
- Генерим случайную соль индивилуально для каждого юзера
- Создаем хеш на основе введенного юзером пароля и соли
- Записываем хеш(не пароль) в БД + соль в отдельном филде
- Юзер вводит в поле авторизации некий пароль
- Берем соль из базы и данный пароль
- Солим только что полученный пароль, в итоге получаем хеш
- Берем валидную хеш из БД и сравниваем ее с только что полученным хешем
- Profit, если введенный пароль вырный авторизируем, если нет говорим юзеру ввести правильный пароль
Суть не в дешифровке хеша из базы и сверке его с введенным паролем, а в создании нового хеша из нового введенного юзером пароля и соли из базы и последующей сверкой нового хеша с хешем из БД.
https://github.com/dcodeIO/bcrypt.js
var bcrypt = require('bcryptjs');
bcrypt.genSalt(10, function(error, salt) { // генерим соль >> передаем ее в колбек
bcrypt.hash("some_password_from_input", salt, function(error, hash) { // берем пароль из инпута + соль и генерим хеш
// получаем хеш и сохраняем в БД
// в случае использования bcryptjs необходимость хранения соли отпадает, почему объясняется ниже
});
});
- Берем пароль из инпута, хеш из БД(hash_from_db)
- Ф-ция compare сама извлекает соль из хеша(hash_from_db) и солит им нововведенный пароль
- И сверивает новый хеш с хешем из БД(hash_from_db) Вот почему мы не сохраняли соль в БД, bcryptjs сам знает как извлечь соль из хеша, и унас отпадает необходимость хранить соль отдельно
bcrypt.compare("some_password", hash_from_db, function(error, result) {
if (result){
// авторизируем юзера
}
});
var sol = bcrypt.genSaltSync();
>> '$2a$10$ydKFuX0Jfxsega193bReze'
var myHash = bcrypt.hashSync('123456', sol);
>> '$2a$10$ydKFuX0Jfxsega193bRezezqVklYDdrYSAHk5ho1uE8CPDuqNA8p6'
Первые 29 символов и есть соль $2a$10$ydKFuX0Jfxsega193bReze
p.s.