Код:
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-characters'] );
Результат:
Warning: password_hash(): Provided salt is too short: 21 expecting 22
код:
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersA'] );
Результат:
$2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32
код:
echo password_hash("stackoverflow", PASSWORD_DEFAULT, ['salt' => 'twenty-one-charactersB'] ); $2y$10$dHdlbnR5LW9uZS1jaGFyYOVyX13hK9eb4/KXMAkHsAJX..YR7t/32
Вопрос:
Как вы видите, добавив A и B к 21 символьной строке, мы создали две разные соли из 22 символов, но ХАШ – это то же самое! Это 22-й символ игнорируется? Если он игнорируется, то почему он спрашивает соль 22 соли?
BCrypt ожидает соль данного алфавита: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
. Поскольку вы можете видеть, что «-» не в нем, и поэтому ваша соль недействительна. Действительная соль, вы можете видеть открытый текст в хэш-значении.
В большинстве случаев лучше отказаться от параметра соли. Без этого параметра функция будет генерировать криптографически безопасную соль из случайного источника операционной системы.
password_hash("stackoverflow", PASSWORD_DEFAULT);
Тем не менее, вы правы, когда говорите, что BCrypt не использует полные 22 символа. Похоже, что BCrypt использует только 126 бит соли вместо 128 бит, которые вы получаете с 22 кодированными символами base64. Для получения дополнительной информации вы можете взглянуть на эту дискуссию. Почему crypt / blowfish генерируют один и тот же хэш ….
Во-первых, пожалуйста , не предоставляйте свою соль. Вы не собираетесь делать лучшую работу, чем это делает библиотека. И использование статических солей (как вы делали в этом примере) поставит под угрозу безопасность. Просто позвольте ему генерировать свою соль (кстати, я считаю, что позволить солью – самая большая ошибка, которую я совершил в этом API).
Что касается 21 против 22 символов, прочитайте этот ответ .
В принципе, соль кодируется base64. Это означает, что каждые 6 бит соли кодируются в 8 бит. Таким образом, каждый байт кодированной соли составляет 6 бит.
21 символ – 126 бит. Это означает, что используется только часть 22-го символа (первые 2 декодированных бита). Причина, по которой вы получаете один и тот же хэш с A
и B
, состоит в том, что ведущие 2 бита одинаковы для обоих символов.
Фактически, для 22-го байта всего 4 уникальных хэша.