Безопасное хранение паролей
пароли никогда не хранятся в открытом виде; используется медленное одностороннее хэширование с солью (bcrypt, Argon2)
Почему это важно: утечка базы с MD5-хэшами паролей — катастрофа за минуты. Bcrypt с правильным cost factor даёт месяцы брутфорса
Главная идея
bcrypt хэширует пароль с уникальной случайной солью; сравнение занимает ~100ms; это медленно специально — для защиты от брутфорса
Как это выглядит на практике
- Регистрация: bcrypt.hash(password, 12) — хэшируем с cost factor 12 (~300ms).
- Результат: $2b$12$salt+hash — соль встроена в строку результата.
- Логин: bcrypt.compare(entered_password, stored_hash) — автоматически извлекает соль.
- Сравнение занимает ~300ms — одинаково для верного и неверного пароля.
- Через 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 атаки бесполезны.
Термины урока
Связь с работой 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.
- Используй библиотеку; не реализуй хэширование вручную.
Итог
Хэширование паролей — одна из тех задач, где нельзя изобретать велосипед. Используйте проверенные библиотеки с правильными параметрами.