javascript42
Главная
Все учебники
Блог
Учебник Password-hash
Введение в хеширование паролей
Что такое хеширование и зачем оно нужно
Разница между шифрованием, кодированием и хешированием
История атак на пароли: радужные таблицы, брутфорс, словарные атаки
Соль, перец и итерации: базовые концепции защиты
Обзор популярных алгоритмов: MD5, SHA, bcrypt, Argon2, scrypt
Почему MD5 и SHA не подходят для паролей
Место библиотеки password-hash в экосистеме Node.js
Установка и настройка окружения
Требования: Node.js и npm
Установка через npm и yarn
Подключение в CommonJS и ESM
Структура пакета: что внутри node_modules/password-hash
Совместимость версий и известные ограничения
Первый запуск: проверка работоспособности
Основной API библиотеки
Метод generate: создание хеша пароля
Метод verify: проверка пароля против хеша
Метод isHashed: определение, является ли строка хешем
Формат выходной строки: алгоритм, соль и хеш через разделитель
Внутренняя структура хеша: разбор по частям
Поведение при передаче неверных типов и null
Параметры и конфигурация
Выбор алгоритма хеширования через опции
Установка длины соли
Количество итераций и его влияние на производительность
Передача собственной соли: когда это оправдано
Конфигурация по умолчанию и её разбор
Совместимость хешей при смене параметров
Алгоритмы хеширования в контексте библиотеки
SHA1 как алгоритм по умолчанию: плюсы и минусы выбора
SHA256 и SHA512: настройка и сравнение
Ограничения: отсутствие bcrypt и Argon2 из коробки
Итеративное хеширование внутри библиотеки
Энтропия соли и криптографическая стойкость
Работа с паролями в реальных условиях
Получение пароля от пользователя и базовая валидация
Хеширование при регистрации пользователя
Верификация при входе в систему
Хранение хеша в базе данных: правила и ошибки
Смена пароля: правильный порядок действий
Сброс пароля: что хранить, что не хранить
Работа с временными токенами и их хеширование
Интеграция с базами данных
Хеш как строковое поле: длина и тип колонки
Интеграция с MongoDB и Mongoose
Интеграция с PostgreSQL через pg и Sequelize
Интеграция с MySQL и SQLite
Миграции при смене алгоритма хеширования
Индексирование и хеши: почему индекс на хеш бесполезен
Интеграция с фреймворками
Использование в Express.js: регистрация и логин
Middleware для автоматической верификации
Интеграция с Passport.js: стратегия local
Использование в Fastify
Использование в Koa
Разделение логики хеширования через сервисный слой
Безопасность: углублённый разбор
Атака на основе утечки базы данных
Почему длинная соль важнее сложного алгоритма
Timing attack: как работает и как защититься
Постоянное время сравнения строк в Node.js
Логирование и случайное попадание пароля в логи
Переменные окружения и секреты рядом с хешированием
Ограничение длины входного пароля: атака на bcrypt и аналогии
HTTPS и защита на транспортном уровне
Производительность и нагрузка
Влияние количества итераций на время отклика
Бенчмаркинг generate и verify
Хеширование в синхронном и асинхронном режиме
Вынос хеширования в Worker Threads
Очереди задач для хеширования при высокой нагрузке
Кеширование сессий как альтернатива повторной верификации
Тестирование кода с password-hash
Модульное тестирование функций регистрации и логина
Мокирование password-hash в юнит-тестах
Интеграционные тесты с реальной базой данных
Тестирование граничных случаев: пустой пароль, unicode, длинные строки
Покрытие сценариев атак в тестах
Инструменты: Jest, Mocha, Chai
Миграция и совместимость
Переход с незащищённых MD5/SHA хешей
Стратегия ленивой миграции при входе пользователя
Пакетная перехеширование офлайн
Переход на bcrypt или Argon2: когда password-hash недостаточно
Сосуществование нескольких форматов хешей в одной базе
Версионирование алгоритма в схеме хранения
Расширение и кастомизация
Написание обёртки над password-hash с единым интерфейсом
Добавление поддержки перца через обёртку
Подключение bcrypt рядом с password-hash для гибридной схемы
Логирование и аудит операций хеширования
Создание собственного провайдера алгоритма
Типичные ошибки и отладка
Сравнение хеша с хешем вместо пароля с хешем
Двойное хеширование и его последствия
Потеря кодировки при передаче через HTTP
Обрезка пробелов и невидимые символы в пароле
Ошибки при десериализации хеша из базы данных
Несоответствие версий библиотеки между окружениями
Отладка через разбор структуры хеш-строки вручную
Сравнение с альтернативами
password-hash против bcryptjs
password-hash против argon2
password-hash против crypto модуля Node.js напрямую
password-hash против jsonwebtoken для аутентификации
Когда password-hash является достаточным решением
Когда следует выбрать другую библиотеку