Menu
CoddyTech

Никогда не храните пароли

Часть раздела Аутентификация и безопасность путешествия по 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.

challenge icon

Задание

Легко
  • В 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Аутентификация и безопасность