Хеширование — это процесс преобразования входных данных произвольной длины в строку фиксированного размера с помощью криптографической функции. В контексте хранения паролей хеширование используется для того, чтобы вместо самих паролей в базе данных сохранялись их необратимые представления.
Хеш-функция обладает рядом ключевых свойств:
Пример:
пароль: password123
хеш: $2a$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36FZ0pniS3pSkeCZMt2rt7e
Даже незначительное изменение строки (password124)
приведёт к совершенно другому хешу.
Хранение паролей в открытом виде (plain text) — одна из самых критичных ошибок в разработке систем аутентификации.
Основные риски:
Если пароли хранятся в открытом виде, компрометация базы данных автоматически означает компрометацию всех аккаунтов.
Процесс регистрации:
Процесс входа:
Если значения совпадают — доступ предоставляется.
Использование обычных криптографических функций (например, SHA-256) недостаточно для защиты паролей.
Проблемы:
Современные хеш-функции разработаны для максимальной производительности. Это делает их уязвимыми для атак перебора (brute force).
Злоумышленник может проверять миллионы паролей в секунду.
Используются заранее подготовленные списки популярных паролей:
123456
password
qwerty
admin
Хеши таких значений легко вычисляются заранее.
Это базы данных, содержащие пары:
пароль → хеш
Позволяют мгновенно находить исходный пароль по известному хешу.
Соль — это случайная строка, добавляемая к паролю перед хешированием.
hash = hash(пароль + соль)
Пример:
пароль: password123
соль: XyZ!9kLm
результат: hash(password123XyZ!9kLm)
Свойства соли:
Для защиты паролей используются специальные алгоритмы, намеренно замедленные.
Идея:
Такие алгоритмы:
bcrypt — это адаптивный алгоритм хеширования паролей, разработанный специально для защиты от атак перебора.
Основные особенности:
bcrypt автоматически генерирует соль и включает её в итоговый хеш:
$2a$10$EixZaYVK1fsbw1ZfbX3OXe...
Структура:
$2a$ — версия алгоритма10 — cost factor (сложность)Параметр определяет количество итераций:
2^cost
Пример:
Чем выше значение — тем медленнее вычисление.
bcrypt использует алгоритмы, плохо оптимизируемые для параллельных вычислений, что снижает эффективность GPU и ASIC.
bcrypt.js — это реализация алгоритма bcrypt на чистом JavaScript.
Преимущества:
Недостаток:
bcrypt), но достаточно
безопасен при правильной настройкеАтакующий проверяет все возможные комбинации:
aaaaaa
aaaaab
aaaaac
...
bcrypt замедляет процесс настолько, что атака становится нецелесообразной.
Используются списки популярных паролей.
bcrypt усложняет массовую проверку благодаря:
Становятся бесполезными из-за уникальной соли для каждого пользователя.
hash = sha256(password)
Недостаток: слишком быстро, легко поддаётся перебору.
hash = hash(password)
Результат: одинаковые пароли → одинаковые хеши.
salt = "12345"
hash = hash(password + salt)
Проблема: компрометация соли ломает всю систему.
cost = 4
Результат: атаки становятся дешёвыми и быстрыми.
Выбор параметров bcrypt зависит от:
Практический подход:
Любая современная система аутентификации должна:
Игнорирование этих принципов приводит к:
bcrypt.js реализует все ключевые принципы безопасного хеширования:
В дальнейшем изучение библиотеки сводится к практическому применению этих концепций в коде: генерации хеша и проверке пароля при аутентификации.