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; }
для получения информации о хэшировании и безопасности читайте это
Надеюсь это поможет