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 и более ранними...
РЕДАКТИРОВАТЬ: На мой вопрос технически дан ответ, и это моя вина, что я не спросил должным образом. Я реализовал:
$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 />");
возвращает: $2г$08$43f053b1538df81054d4cOJyrO5/j7NtZBCw6LrFof29cLBs7giK6
print(crypt($password, "$2a$08$".substr($storedpass, 60)));
возвращает: $2a$08$43f053b1538df81054d4cOPSGh/LMc0PZx6RC6PlXOSc61BKq/F6.
mcrypt_create_iv(size, MCRYPT_DEV_URANDOM)
может быть хорошим выбором. Или вы можете напрямую читать из/dev/urandom
в Linux stackoverflow.com/a/1551064/445517 илиopenssl_random_pseudo_bytes
- person CodesInChaos   schedule 15.08.2012