Механизм сброса пароля опирается на раздельное хранение двух сущностей: постоянного пароля пользователя и временных токенов восстановления доступа. Ошибки в проектировании этой части системы приводят к компрометации учетных записей даже при использовании устойчивых хэш-функций из библиотеки наподобие password-hash в JavaScript.
Пароль в системе никогда не хранится в исходном виде. Для этого используется криптографическое хэширование с солью. Библиотека password-hash применяется для генерации необратимого представления пароля, при котором:
Хранимое значение в базе данных включает только результат хэширования и параметры алгоритма (соль, параметры итераций). Сам пароль и его промежуточные формы не сохраняются ни в логах, ни в кэше, ни в резервных копиях в открытом виде.
Минимальная модель пользователя для корректной работы сброса пароля включает:
Избыточное хранение информации о пароле (например, предыдущих паролей в открытом виде) исключается. При необходимости проверки повторного использования сохраняются только хэши предыдущих паролей с ограниченным сроком жизни.
Процесс восстановления доступа основывается на временном токене. Этот токен выполняет роль одноразового ключа и обладает ограниченным временем жизни.
Генерация токена выполняется с использованием криптографически стойкого генератора случайных значений. Важно различать токен в исходном виде и его хранимое представление.
В системе не допускается хранение токена в открытом виде. Вместо этого сохраняется его хэш:
Такой подход снижает риск компрометации в случае утечки базы данных. Даже при доступе к таблице восстановления невозможно использовать токен напрямую.
Повторное использование одного и того же токена исключается. Дополнительная генерация нового токена инвалидирует предыдущие записи.
На практике распространены ошибки, связанные с неверным выбором данных для хранения:
Каждая из этих ошибок снижает эффективность даже корректно реализованного хэширования паролей через password-hash.
Система сброса пароля не заменяет хэширование, а работает поверх него. Основная таблица учетных данных содержит только результат работы хэш-функции, тогда как механизм восстановления использует отдельный слой временных данных.
После установки нового пароля:
Это предотвращает возможность использования устаревших ссылок для восстановления доступа.
Временные данные сброса пароля должны иметь строгие ограничения:
Дополнительно применяется ограничение количества активных токенов на одного пользователя, что снижает риск атак перебора и повторной генерации ссылок.
При использовании библиотеки password-hash в JavaScript логика сброса пароля должна учитывать:
Токен восстановления никогда не используется как часть пароля и не участвует в его хэшировании. Это два независимых криптографических объекта с разными жизненными циклами.
Корректная архитектура предполагает разделение таблиц или коллекций:
Объединение этих сущностей в одну структуру увеличивает поверхность атаки и усложняет контроль доступа.