Функция PHP password_hash солевой длины 21 или 22?

Код:

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 уникальных хэша.