Почему crypt () генерирует разные результаты?

Crypt генерирует разные хэши с теми же входными данными, и [следующий] ранее функциональный хэш-генератор / проверка больше не работает для аутентификации пользователей:

public static function blowfish($password, $storedpass = false) { //if encrypted data is passed, check it against input ($info) if ($storedpass) { if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { return true; } else { return false; } } else { //make a salt and hash it with input, and add salt to end $salt = ""; for ($i = 0; $i < 22; $i++) { $salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); } //return 82 char string (60 char hash & 22 char salt) return crypt($password, "$2y$08$".$salt).$salt; } } 

Я ударяю головой о стену и не нахожу ответов в различиях между внутренними алгоритмами Zend и PHP против алгоритмов операционной системы; или вариации между PHP 5.3.8 и ранее …

EDIT: Мой вопрос технически ответил, и это моя вина, я не спросил должным образом. Я реализовал:

 $salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22); //for ($i = 0; $i < 22; $i++) { //$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1); //} 

Мой настоящий вопрос: почему следующие функции возвращаются по-разному?

 print(substr($storedpass, 0, 60)."<br />"); 

возвращает: $ 2y $ 08 $ 43f053b1538df81054d4cOJyrO5 / j7NtZBCw6LrFof29cLBs7giK6

 print(crypt($password, "$2a$08$".substr($storedpass, 60))); 

возвращает: $ 2a $ 08 $ 43f053b1538df81054d4cOPSGh / LMc0PZx6RC6PlXOSc61BKq / F6.

Поскольку вы создаете salt с помощью случайных чисел,

Функция mt_rand() будет создавать случайное число каждый раз, когда вы вызываете, необязательно с параметрами min, max. Обычно для сильного хеширования паролей криптографии Соль должна генерироваться с использованием криптографически безопасного генератора псевдослучайных чисел (CSPRNG).

Тогда придите к своей проблеме, я предполагаю, что не будет никакой разницы в алгоритме между ZEND и php. Поскольку zend представляет собой фреймворк, обертывающий основной php и использующий его.

Чтобы проверить пароль, как работает проверка crypt

 crypt($password, $stored_hash) == $stored_hash; 

После того, как вы сохранили хеш, когда вы сначала сделаете хэш, это будет легко проверить.

Это то, что на самом деле происходит здесь, если вы передадите хэш в качестве второго параметра функции blowfish, он вернет подтверждение значением bool, независимо от соли.

 if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) { return true; } else { return false; } 

для получения информации о хэшировании и безопасности читайте это

Надеюсь это поможет