Начальный ~20 мин чтения

Безопасное хранение паролей

Урок 5 из 6 в курсе Аутентификация и авторизация

Безопасное хранение паролей

пароли никогда не хранятся в открытом виде; используется медленное одностороннее хэширование с солью (bcrypt, Argon2)

Почему это важно: утечка базы с MD5-хэшами паролей — катастрофа за минуты. Bcrypt с правильным cost factor даёт месяцы брутфорса

Главная идея

bcrypt хэширует пароль с уникальной случайной солью; сравнение занимает ~100ms; это медленно специально — для защиты от брутфорса

Как это выглядит на практике

  1. Регистрация: bcrypt.hash(password, 12) — хэшируем с cost factor 12 (~300ms).
  2. Результат: $2b$12$salt+hash — соль встроена в строку результата.
  3. Логин: bcrypt.compare(entered_password, stored_hash) — автоматически извлекает соль.
  4. Сравнение занимает ~300ms — одинаково для верного и неверного пароля.
  5. Через 2 года iron cost factor до 13 — нагрузка растёт, безопасность сохраняется.

Что происходит под капотом

  • bcrypt = Blowfish cipher с настраиваемым числом раундов; каждое увеличение cost на 1 удваивает время.
  • Соль (128 bit random) делает rainbow table атаки бесполезными; у каждого пользователя уникальный хэш.
  • Argon2 (winner of Password Hashing Competition 2015) — современная альтернатива; параметры: time, memory, parallelism.
  • Timing attack: сравнение строк через == уязвимо; bcrypt.compare() использует constant-time comparison.
  • scrypt — ещё одна альтернатива, применяемая в Bitcoin, Litecoin.

Типичные ошибки и заблуждения

  • Ошибка: SHA-256 достаточен для паролей. SHA-256 — быстрый (миллиарды в секунду на GPU). Bcrypt — медленный специально.
  • Ошибка: шифрование паролей лучше хэширования. Шифрование обратимо; при утечке ключа — утечка паролей. Хэш необратим.
  • Ошибка: bcrypt с cost 10 навсегда. Увеличивайте cost factor каждые 2-3 года вместе с ростом мощности GPU.
  • Ошибка: соль нужно хранить отдельно. bcrypt автоматически встраивает соль в хэш; $2b$12$... содержит и соль, и хэш.

Ключевые выводы

  • Никогда не храните пароли в открытом виде или с быстрым хэшем (MD5, SHA-256).
  • Bcrypt/Argon2 медленны специально — это их ключевое свойство.
  • Cost factor нужно обновлять по мере роста мощности железа.
  • Соль делает каждый хэш уникальным; rainbow table атаки бесполезны.

Термины урока

bcrypt: медленный алгоритм хэширования с настраиваемым cost factor.
Argon2: современный алгоритм хэширования паролей (winner PHC 2015).
Salt: случайная строка, добавляемая к паролю перед хэшированием.
Cost factor (work factor): параметр bcrypt, определяющий число раундов (2^cost).
Rainbow table: предвычисленная таблица хэшей; бесполезна при использовании соли.

Связь с работой backend-разработчика

Правило: bcrypt с cost ≥ 12, или Argon2id с time=3, memory=64MB. Никогда MD5, SHA-*, bcrypt с cost < 10. Проверяй текущие рекомендации OWASP Password Storage Cheat Sheet.

Мини-разбор реальной ситуации

LinkedIn 2012: 6.5 миллионов хэшей SHA-1 без соли утекли. Большинство взломаны за часы через rainbow tables. Если бы использовался bcrypt — взлом занял бы тысячи лет. Цена неправильного выбора алгоритма — репутация компании и безопасность миллионов пользователей.

Что запомнить

  • bcrypt или Argon2id — никогда MD5/SHA.
  • Cost factor ≥ 12 для bcrypt.
  • Используй библиотеку; не реализуй хэширование вручную.

Итог

Хэширование паролей — одна из тех задач, где нельзя изобретать велосипед. Используйте проверенные библиотеки с правильными параметрами.