2014-10-10 8 views
3

Код: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 соли?

+0

Почему вы сажаете себя и не используете по умолчанию? –

+1

Прочитайте заметки на [blowfish] (http://php.net/manual/en/function.crypt.php) алгоритм по умолчанию для деталей соли 22 символов –

ответ

1

BCrypt ожидает соль данного алфавита: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. Поскольку вы можете видеть, что «-» не в нем, и поэтому ваша соль недействительна. Действительная соль, вы можете видеть открытый текст в хэш-значении.

В большинстве случаев лучше отказаться от параметра соли. Без этого параметра функция будет генерировать криптографически безопасную соль из случайного источника операционной системы.

password_hash("stackoverflow", PASSWORD_DEFAULT); 

Тем не менее, вы правы, когда говорите, что BCrypt не использует полные 22 символа. Похоже, что BCrypt использует только 126 бит соли вместо 128 бит, которые вы получаете с 22 кодированными символами base64. Для получения дополнительной информации вы можете ознакомиться с этим обсуждением Why does crypt/blowfish generate the same hash....

+0

Bcrypt использует 22 символа. Но он использует только первые 2 бита 22-го ... – ircmaxell

+0

@ircmaxell - Да, это на самом деле то, что я имел в виду, что случилось с моим ответом? В каждом случае я запомню вашу отличную ссылку. – martinstoeckli

0

Во-первых, , пожалуйста, не предоставляйте свою соль. Вы не собираетесь делать лучшую работу, чем это делает библиотека. И использование статических солей (как вы делали в примере) будет компромисс безопасности. Просто позвольте ему генерировать свою соль (кстати, я считаю, что позволить солью - самая большая ошибка, которую я совершил в этом API).

До 21 против 22 символов, укажите this answer a read.

В принципе, соль кодируется base64. Это означает, что каждые 6 бит соли кодируются в 8 бит. Таким образом, каждый байт кодированной соли составляет 6 бит.

21 символ - 126 бит. Это означает, что используется только часть 22-го символа (первые 2 декодированных бита). Причина, по которой вы получаете один и тот же хеш с A и B, состоит в том, что ведущие 2 бита одинаковы для обоих символов.

На самом деле, существует только 4 уникальных хэша для 22-го байта.