Никогда не храните пароли
Часть раздела Аутентификация и безопасность путешествия по Node.js на Coddy. Урок 1 из 17.
Если база данных утечёт, любой сможет прочитать все пароли, сохранённые в открытом виде, а люди используют один и тот же пароль на других сайтах. Поэтому вместо этого ты сохраняешь хеш: значение, вычисленное на основе пароля, которое нельзя преобразовать обратно в пароль.
Для паролей Node предлагает crypto.scrypt. Она намеренно работает медленно, поэтому подбор миллионов паролей обходится злоумышленнику в несколько часов. Соль — случайные байты, добавляемые перед хешированием, — обеспечивает разные хеши для двух людей с одинаковым паролем. Соль не является секретом: её сохраняют рядом с хешем.
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
const salt = randomBytes(16).toString('hex');
const key = await scryptAsync('pin 4821', salt, 32);
console.log(key.toString('base64'));promisify преобразует callback-функцию scrypt в промис, который можно использовать с await.
Задание
Легко- В
passwords.jsсделай так, чтобыhashPassword(password)возвращалаsalt:hash: 16 случайных байтов соли и 64-байтовый ключ scrypt, оба в шестнадцатеричном формате. GET /debug/users/:usernameпоказывает, что сохранил signup.
Нажми Run. Отправь POST /signup с {"username": "ada", "password": "correct horse"}, затем отправь тот же пароль для bob и сравни обеих пользователей.
Попробуйте сами
import { randomBytes, scrypt } from 'node:crypto';
import { promisify } from 'node:util';
const scryptAsync = promisify(scrypt);
// Преобразует пароль в текст, который сохраняется при регистрации.
// Пока пароль сохраняется в том виде, в котором его ввели.
export async function hashPassword(password) {
return password;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.