Я хочу сохранить хешированный пароль (используя BCrypt) в базе данных. Что будет хорошим типом для этого, и какой будет правильная длина? Пароли, хэшированные с BCrypt, всегда имеют одинаковую длину?
РЕДАКТИРОВАТЬ
Пример хэша:
$2a$10$KssILxWNR6k62B7yiX0GAe2Q7wwHlrzhF3LqtVvpyvHZf0MwvNfVu
Похоже, что после хеширования некоторых паролей BCrypt всегда генерирует хэши по 60 символов.
РЕДАКТИРОВАТЬ 2
Извините, что не упомянул реализацию. Я использую jBCrypt .
Ответы:
Модульный формат склепа для bcrypt состоит из
$2$
,$2a$
Или$2y$
идентификации алгоритма хеширования и формат$
.
,/
,0
-9
,A
-Z
,a
- ,z
что отличается от стандартной базы 64 кодирования алфавита) , состоящий из:Таким образом, общая длина составляет 59 или 60 байтов соответственно.
При использовании формата 2a вам понадобится 60 байтов. И , таким образом , для MySQL я рекомендую использовать
CHAR(60) BINARY
илиBINARY(60)
(см The _bin и бинарные Collations для получения информации о различиях).CHAR
не является бинарно-безопасным, и равенство зависит не только от значения байта, но и от фактического сопоставления; в худшем случаеA
рассматривается как равныйa
. См ._bin
Иbinary
сопоставления для получения дополнительной информации.источник
SQL_Latin1_General_CP1_CS_AS
неизвестен в MySQL. Что известноlatin1_general_cs
.2
,2a
и2y
среднего значения для алгоритма хеширования и формата. Я не мог найти простой ответ с некоторыми поисками.Хеш Bcrypt может храниться в
BINARY(40)
столбце.BINARY(60)
Как показывают другие ответы, это самый простой и естественный выбор, но если вы хотите максимизировать эффективность хранения, вы можете сэкономить 20 байтов, без потерь деконструируя хеш. Я подробно описал это на GitHub: https://github.com/ademarre/binary-mcfХеши Bcrypt следуют структуре, называемой модульным форматом шифрования (MCF). Binary MCF (BMCF) декодирует эти текстовые хэш-представления в более компактную двоичную структуру. В случае Bcrypt результирующий двоичный хэш составляет 40 байтов.
Гамбо хорошо объяснил четыре компонента хеша Bcrypt MCF:
Декодирование в BMCF происходит так:
$<id>$
может быть представлен в 3 битах.<cost>$
, 04-31, могут быть представлены в 5 битах. Положите их вместе на 1 байт.1 + 16 + 23
Вы можете прочитать больше по ссылке выше, или изучить мою реализацию PHP , также на GitHub.
источник
Если вы используете PHP
password_hash()
сPASSWORD_DEFAULT
алгоритмом для генерации хэша bcrypt (который, как я полагаю, представляет большой процент людей, читающих этот вопрос), не забывайте, что в будущемpassword_hash()
может использоваться другой алгоритм по умолчанию, и поэтому влияет на длину хеша (но она не обязательно может быть длиннее).Со страницы руководства:
Использование bcrypt, даже если у вас есть 1 миллиард пользователей (то есть вы в настоящее время конкурируете с Facebook) для хранения 255-байтовых хэшей паролей, это будет всего ~ 255 ГБ данных - размером с небольшой жесткий диск SSD. Крайне маловероятно, что хранение хэша пароля станет узким местом в вашем приложении. Однако в шансе , что пространство для хранения действительно является проблемой для какой - то причины, вы можете использовать
PASSWORD_BCRYPT
в силуpassword_hash()
для использования Bcrypt, даже если это не по умолчанию. Просто будьте в курсе всех уязвимостей, обнаруженных в bcrypt, и просматривайте примечания к выпуску каждый раз, когда выходит новая версия PHP. Если алгоритм по умолчанию когда-либо изменяется, было бы хорошо проанализировать причину и принять обоснованное решение, использовать новый алгоритм или нет.источник
Я не думаю, что есть какие-то хитрые уловки, которые вы можете сделать, храня это, как вы можете сделать, например, с хешем MD5.
Я думаю, что ваш лучший выбор - хранить его как
CHAR(60)
всегда длиной 60 символовисточник