php - remove - ¿Por qué crypt() genera resultados diferentes?
strip_tags wordpress (1)
Porque estás creando la salt
con la ayuda de números aleatorios,
La función mt_rand()
creará un número aleatorio cada vez que llame, opcionalmente con parámetros mt_rand()
y máximos. Por lo general, para el cifrado fuerte de contraseñas de criptografía, se debe generar sal utilizando un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG).
Luego, acércate a tu problema, supongo que no habrá diferencia en el algoritmo entre ZEND y php. Porque zend es un marco que envuelve el núcleo php y lo usa.
Para verificar la contraseña, cómo funciona el cheque de crypt
crypt($password, $stored_hash) == $stored_hash;
Una vez que haya almacenado el hash al primer hash, será fácil verificarlo con esto.
Eso es lo que realmente sucede aquí, si pasas el hash como segundo parámetro a la función blowfish, devolverá la verificación por un valor de bool, independientemente de la sal.
if (substr($storedpass, 0, 60) == crypt($password, "$2y$08$".substr($storedpass, 60))) {
return true;
} else {
return false;
}
para su información sobre hash y seguridad, lea esto
Espero que esto ayude
Crypt está generando hashes diferentes con los mismos datos de entrada, y el [siguiente] hash generator / check previamente funcional ya no funciona para la autenticación de usuarios:
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;
}
}
Me estoy golpeando la cabeza contra la pared y no he encontrado respuestas en las diferencias entre los algoritmos internos de Zend vs PHP versus los algoritmos del sistema operativo; o variaciones entre PHP 5.3.8 vs anterior ...
EDIT: Mi pregunta es técnicamente respondida, y es mi culpa que no pregunté correctamente. Implementé:
$salt = substr(bin2hex(openssl_random_pseudo_bytes(22)), 0, 22);
//for ($i = 0; $i < 22; $i++) {
//$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);
//}
Mi verdadera pregunta es; ¿Por qué las siguientes funciones vuelven de manera diferente?
print(substr($storedpass, 0, 60)."<br />");
devoluciones: $ 2y $ 08 $ 43f053b1538df81054d4cOJyrO5 / j7NtZBCw6LrFof29cLBs7giK6
print(crypt($password, "$2a$08$".substr($storedpass, 60)));
devoluciones: $ 2a $ 08 $ 43f053b1538df81054d4cOPSGh / LMc0PZx6RC6PlXOSc61BKq / F6.