Хеширование паролей в библиотеке Password-hash основано на применении
криптографических функций, которые преобразуют исходную строку пароля в
фиксированную строку-результат (хеш), необратимую в вычислительном
смысле. Метод generate отвечает за формирование такого хеша
с учётом выбранного алгоритма, параметров стойкости и дополнительной
соли.
Метод generate используется для создания защищённого
представления пароля, пригодного для хранения в базе данных. Основная
идея заключается в том, что в системе никогда не сохраняется исходный
пароль, а только его хеш, сформированный с использованием
криптографической соли и параметров сложности вычислений.
Ключевая задача метода — обеспечить:
В типичной реализации JavaScript-библиотеки Password-hash метод может иметь следующую структуру:
PasswordHash.generate(password, options)
Где:
password — исходная строка пароля;options — объект конфигурации, влияющий на алгоритм
хеширования.Объект options определяет поведение генерации хеша и
может включать следующие поля:
algorithm Определяет криптографический алгоритм:
bcryptargon2pbkdf2Выбор алгоритма влияет на устойчивость и производительность.
saltLength Длина случайной соли в байтах. Чем больше значение, тем выше устойчивость к предвычисленным атакам.
iterations / cost Количество итераций или коэффициент сложности вычислений. Используется для замедления процесса подбора пароля.
outputFormat Формат результата:
base64hex$algo$cost$salt$hash)memoryCost (для Argon2) Объём памяти, используемый алгоритмом, повышающий устойчивость к GPU-атакам.
Процесс генерации хеша состоит из последовательных этапов:
Генерация соли Создаётся криптографически случайная последовательность байтов.
Подготовка параметров Формируется конфигурация алгоритма (итерации, память, фактор сложности).
Применение хеш-функции Пароль объединяется с солью и обрабатывается выбранным алгоритмом.
Итеративное усиление В зависимости от параметров выполняется многократное повторение вычислений.
Формирование итоговой строки Результат кодируется в выбранном формате вместе с солью и метаданными.
Большинство современных реализаций используют асинхронный вариант метода, чтобы не блокировать event loop:
const hash = await PasswordHash.generate("user_password", {
algorithm: "argon2",
saltLength: 16,
iterations: 3,
memoryCost: 4096,
outputFormat: "base64"
});
Асинхронный режим особенно важен при использовании ресурсоёмких алгоритмов, так как генерация может занимать заметное время.
Некоторые реализации предоставляют синхронный аналог:
const hash = PasswordHash.generateSync("user_password", {
algorithm: "bcrypt",
saltLength: 16,
cost: 12
});
Синхронная версия выполняется в основном потоке, что может снижать производительность при высокой нагрузке, но упрощает использование в простых сценариях.
Результат работы метода обычно содержит несколько компонентов:
Пример структурированного формата:
$argon2id$v=19$m=4096,t=3,p=1$base64salt$base64hash
Такая структура позволяет восстановить параметры при проверке пароля без дополнительного хранения конфигурации.
Перед генерацией выполняется проверка:
При нарушении условий метод возвращает ошибку, предотвращая генерацию некорректного хеша.
Увеличение значений iterations, cost или
memoryCost повышает устойчивость к атакам, но увеличивает
время генерации. Баланс между безопасностью и производительностью
определяется характеристиками системы.
Для серверных приложений часто используются более высокие значения, тогда как для клиентских сценариев — более лёгкие конфигурации.
Каждый вызов generate с одинаковым паролем и разными
параметрами соли приводит к разным результатам. Это обеспечивается
обязательной случайностью соли, которая делает невозможным сравнение
хешей между собой без дополнительного алгоритма проверки.
Соль выполняет критическую функцию:
В большинстве реализаций соль хранится вместе с хешем в итоговой строке.
import PasswordHash from "password-hash";
const password = "securePassword123";
const hashed = await PasswordHash.generate(password, {
algorithm: "argon2",
saltLength: 16,
memoryCost: 8192,
iterations: 4,
outputFormat: "hex"
});
Результат содержит закодированную информацию, необходимую для последующей проверки пароля при аутентификации, без хранения исходного значения.