Есть тонкость, о которой редко задумываются: ограничение bcrypt в 72 байта работает по-разному для разных языков. Один символ кириллицы в UTF-8 занимает 2 байта — значит, реальный лимит для русского пароля составляет около 36 символов, а не 72, как для латиницы. Пароль "оченьнадежныйпарольдлямоегоаккаунта" (36 символов) уже занимает все 72 байта, и всё, что после него, bcrypt просто отбросит.
Почему это важно на практике
Если пользователь вводит пароль на кириллице длиннее ~36 символов, символы после этой границы никак не влияют на итоговый хеш. Два разных «хвоста» после 36-го символа дадут абсолютно одинаковый результат. Для большинства паролей это не проблема — 36 символов кириллицей уже очень длинная парольная фраза, — но при генерации парольных фраз (passphrase) из нескольких русских слов границу стоит держать в уме.
Что такое cost factor
Bcrypt намеренно медленный: параметр "cost" задаёт число внутренних раундов в степени двойки (2^cost), обычно от 10 до 12. Чем выше значение, тем на порядки дольше проверка одного пароля — и во столько же раз дороже перебор для атакующего с украденной базой хешей.
Встроенная соль
Bcrypt автоматически генерирует уникальную случайную соль для каждого пароля и вшивает её прямо в результат — отдельно хранить её не нужно. Это значит, что два одинаковых пароля дают разные хеши, и заранее посчитанные таблицы (rainbow tables) для популярных паролей бесполезны — каждый хеш приходится атаковать индивидуально.
Зачем это нужно
- Правильно хранить пароли пользователей в базе данных приложения.
- Понимать, почему SHA-256 или MD5 — плохой выбор для хеширования паролей.
- Тестировать или мигрировать систему аутентификации, использующую bcrypt.
36 символов, а не 72
Байтовый лимит одинаков для всех языков — 72 байта, — но количество символов, которое в него помещается, зависит от алфавита. Для латиницы это 72 символа, для кириллицы — вдвое меньше из-за двухбайтовой кодировки каждой буквы в UTF-8. Разработчикам, ориентированным на русскоязычную аудиторию, стоит учитывать это при обсуждении требований к минимальной и максимальной длине пароля.