Какой тип/длину столбца следует использовать для хранения хэшированного пароля 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. Если алгоритм по умолчанию когда-либо менялся было бы хорошо рассмотреть почему и принять обоснованное решение, следует ли использовать новый алгоритм или нет.