Какой тип/длину столбца следует использовать для хранения хэшированного пароля Bcrypt в базе данных?
Я хочу сохранить хэшированный пароль (с помощью BCrypt) в базе данных. Какой был бы хороший тип для этого, и какая была бы правильная длина? Хэшируются ли пароли с помощью BCrypt всегда одинаковой длины?
EDIT
пример хэш:
a$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
после хэширования некоторых паролей, кажется, что BCrypt всегда генерирует 60 символов хэшей.
редактировать 2
Извините, что не упомянул реализация. Я использую jBCrypt.
4 ответа:
модульный формат крипты для bcrypt состоит из
$,a$илиy$определение алгоритм хэширования и формат- двузначное значение, обозначающее параметр стоимости, за которым следует
$- база длиной 53 символа-64-кодированное значение (они используют алфавит
.,/,0-9,A-Z,a-zчто это стандартная база 64 Кодировка алфавит), состоящий из:
- 22 символа соли (эффективно только 128 бит из 132 декодированных бит)
- 31 символ зашифрованного вывода (фактически только 184 бита из 186 декодированных битов)
таким образом, общая длина-59 или 60 байт соответственно.
как вы используете формат 2a, вам понадобится 60 байт. И поэтому для MySQL я буду рекомендовать использовать
CHAR(60) BINARYилиBINARY(60)(см. The _bin и binary параметры сортировки для получения информации о разнице).
CHARне является безопасным двоичным и равенство зависит не только от значения байта, но и от фактических параметров сортировки; в худшем случаеAсчитается равнымa. Смотрите The_binиbinaryпараметры сортировки для получения дополнительной информации.
если вы используете PHP
password_hash()СPASSWORD_DEFAULTалгоритм для генерации хэша bcrypt (который я бы предположил, что это большой процент людей, читающих этот вопрос) обязательно имейте в виду, что в будущемpassword_hash()может использоваться другой алгоритм по умолчанию, и это может повлиять на длину хэша (но это не обязательно может быть больше).со страницы руководства:
отметим, что эта константа предназначена для изменения со временем как новые так и более сильные алгоритмы добавляются в PHP. По этой причине, длина результат использования этого идентификатора может изменяться с течением времени. Следовательно, рекомендуется хранить результат в столбце базы данных, который может расширить за 60 символов (255 символов было бы хорошим выбором).
используя bcrypt, даже если у вас есть 1 миллиард пользователей (т. е. вы в настоящее время конкурируете с facebook) для хранения 255-байтовых хэшей паролей, это будет только ~255 Гигабайт данных-примерно размер небольшого SSD жесткого диска. Крайне маловероятно, что хранение хэша пароля будет узким местом в вашем приложении. Однако в случае, если это место для хранения действительно и проблема по какой-то причине, вы можете использовать
PASSWORD_BCRYPTв законную силуpassword_hash()использовать bcrypt, даже если это не по умолчанию. Просто будьте в курсе всех уязвимостей, обнаруженных в bcrypt, и просматривайте заметки о выпуске каждый раз, когда выпускается новая версия PHP. Если алгоритм по умолчанию когда-либо менялся было бы хорошо рассмотреть почему и принять обоснованное решение, следует ли использовать новый алгоритм или нет.