StudyCode
Пароли нельзя хранить в открытом виде: утечка БД отдаст атакующему все аккаунты, включая чужие сервисы (люди повторяют пароли). Хранят хеш — необратимую свёртку: при логине хешируем введённое и сравниваем. Но SHA-256 не подходит: он создан быть быстрым, GPU считает миллиарды таких хешей в секунду — короткие пароли переберутся за часы. bcrypt (и scrypt, argon2) — намеренно медленные функции с настраиваемой сложностью (cost factor) и встроенной солью: соль делает бесполезными радужные таблицы и скрывает одинаковые пароли, а медленность превращает перебор из часов в столетия. С ростом мощности железа cost просто увеличивают.
const bcrypt = require('bcrypt');
// Регистрация: соль генерируется и вшивается в хеш
const hash = await bcrypt.hash(password, 12); // 12 — cost factor
await db.users.create({ email, passwordHash: hash });
// $2b$12$N9qo8uLOickgx2ZMRZoMye... — соль внутри строки
// Логин: сравнение с учётом соли
const user = await db.users.findByEmail(email);
const ok = await bcrypt.compare(password, user.passwordHash);
if (!ok) return res.status(401).json({ error: 'Неверные данные' });
// ❌ Так нельзя: SHA-256 слишком быстрый для паролей
// crypto.createHash('sha256').update(password).digest('hex')