Какой тип/длину столбца следует использовать для хранения хэшированного пароля Bcrypt в базе данных?


Я хочу сохранить хэшированный пароль (с помощью BCrypt) в базе данных. Какой был бы хороший тип для этого, и какая была бы правильная длина? Хэшируются ли пароли с помощью BCrypt всегда одинаковой длины?

EDIT

пример хэш:

a$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu

после хэширования некоторых паролей, кажется, что BCrypt всегда генерирует 60 символов хэшей.

редактировать 2

Извините, что не упомянул реализация. Я использую jBCrypt.

4 245

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 параметры сортировки для получения дополнительной информации.

хэш Bcrypt может храниться в

если вы используете PHP password_hash() С PASSWORD_DEFAULT алгоритм для генерации хэша bcrypt (который я бы предположил, что это большой процент людей, читающих этот вопрос) обязательно имейте в виду, что в будущем password_hash() может использоваться другой алгоритм по умолчанию, и это может повлиять на длину хэша (но это не обязательно может быть больше).

со страницы руководства:

отметим, что эта константа предназначена для изменения со временем как новые так и более сильные алгоритмы добавляются в PHP. По этой причине, длина результат использования этого идентификатора может изменяться с течением времени. Следовательно, рекомендуется хранить результат в столбце базы данных, который может расширить за 60 символов (255 символов было бы хорошим выбором).

используя bcrypt, даже если у вас есть 1 миллиард пользователей (т. е. вы в настоящее время конкурируете с facebook) для хранения 255-байтовых хэшей паролей, это будет только ~255 Гигабайт данных-примерно размер небольшого SSD жесткого диска. Крайне маловероятно, что хранение хэша пароля будет узким местом в вашем приложении. Однако в случае, если это место для хранения действительно и проблема по какой-то причине, вы можете использовать PASSWORD_BCRYPT в законную силу password_hash() использовать bcrypt, даже если это не по умолчанию. Просто будьте в курсе всех уязвимостей, обнаруженных в bcrypt, и просматривайте заметки о выпуске каждый раз, когда выпускается новая версия PHP. Если алгоритм по умолчанию когда-либо менялся было бы хорошо рассмотреть почему и принять обоснованное решение, следует ли использовать новый алгоритм или нет.

Я не думаю, что есть какие-то аккуратные трюки, которые вы можете сделать, храня это, как вы можете сделать, например, с хэшем MD5.

Я думаю, что лучше всего хранить его как CHAR(60) Как это всегда 60 символы