Skip to content

Instantly share code, notes, and snippets.

@zmts
Last active July 14, 2023 10:21
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save zmts/b72d3bcfd07634ff519da407bb86f361 to your computer and use it in GitHub Desktop.
Save zmts/b72d3bcfd07634ff519da407bb86f361 to your computer and use it in GitHub Desktop.
Про хранение паролей в БД

Про хранение паролей в БД

При создании нового юзера

  1. При регистрации юзер вводит некий пароль
  2. Генерим случайную соль индивилуально для каждого юзера
  3. Создаем хеш на основе введенного юзером пароля и соли
  4. Записываем хеш(не пароль) в БД + соль в отдельном филде

Авторизация существующего юзера

  1. Юзер вводит в поле авторизации некий пароль
  2. Берем соль из базы и данный пароль
  3. Солим только что полученный пароль, в итоге получаем хеш
  4. Берем валидную хеш из БД и сравниваем ее с только что полученным хешем
  5. 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 необходимость хранения соли отпадает, почему объясняется ниже
    });
});

Практическое применение: проверка хешей

  1. Берем пароль из инпута, хеш из БД(hash_from_db)
  2. Ф-ция compare сама извлекает соль из хеша(hash_from_db) и солит им нововведенный пароль
  3. И сверивает новый хеш с хешем из БД(hash_from_db) Вот почему мы не сохраняли соль в БД, bcryptjs сам знает как извлечь соль из хеша, и унас отпадает необходимость хранить соль отдельно
bcrypt.compare("some_password", hash_from_db, function(error, result) {
    if (result){
        // авторизируем юзера
    }
});

Откуда bcrypt.compare берет соль

var sol = bcrypt.genSaltSync();
>> '$2a$10$ydKFuX0Jfxsega193bReze'

var myHash = bcrypt.hashSync('123456', sol);
>> '$2a$10$ydKFuX0Jfxsega193bRezezqVklYDdrYSAHk5ho1uE8CPDuqNA8p6'

Первые 29 символов и есть соль $2a$10$ydKFuX0Jfxsega193bReze

p.s.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment