password_verify - ¿Qué pasará si cambian PASSWORD_DEFAULT en la biblioteca de contraseñas de PHP?
password_hash php ejemplo (2)
Considere esta línea de código usando PHP:
$password = password_hash($password, PASSWORD_DEFAULT);
¿Qué pasará si cambian el algoritmo de hash de contraseña predeterminado? Quiero decir que tendré contraseña hash dentro de la base de datos. Entonces, desde mi propia comprensión, será imposible verificar la contraseña porque el algoritmo de hashing se cambiará por completo.
Lo que sucedería es que las contraseñas recientemente creadas con hash usarán el nuevo algoritmo, obviamente.
Sin embargo, no debe preocuparse por esto, ya que todo está diseñado teniendo en cuenta la compatibilidad con versiones anteriores: su código no se romperá cuando cambie el algoritmo predeterminado, siempre que use las funciones de password_*()
correctamente.
Por correcto, quiero decir usar password_verify()
.
password_verify()
acepta una contraseña de texto sin formato y un hash, y puede determinar fácilmente cuál es el algoritmo utilizado al mirar el hash que lo alimentas. Por lo tanto, también sería capaz de verificar una contraseña que ha sido procesada usando un algoritmo antiguo, no solo el anterior, sino cualquier algoritmo que sea compatible.
De hecho, el único propósito de la constante PASSWORD_DEFAULT
es que puede migrar fácilmente hashes anteriores a un nuevo algoritmo (una vez que se agrega uno). Esto sucede de la siguiente manera:
- Cuando un usuario inicia sesión, usted verifica su contraseña mediante
password_verify()
(cualquier algoritmo hash que tenga una constantePASSWORD_<name>
funcionará). - Usted llama a
password_needs_rehash()
, y si la contraseña que acaba de verificar utiliza un algoritmo anterior (o un parámetro de "costo" más bajo) - devolverá booleano TRUE.- Si boolean TRUE fue devuelto, ahora puede reemplazar el hash viejo por uno que use el nuevo algoritmo; puede hacerlo durante un inicio de sesión, porque el usuario acaba de darle la contraseña y ha verificado que es correcta.
En resumen, es una API muy, muy bien diseñada y resuelve problemas que ni siquiera has pensado. No te preocupes por eso
Editar (anotado en los comentarios):
Sin embargo, debe tenerse en cuenta que los nuevos algoritmos darán como resultado longitudes de hash más largas, por lo que si almacena las contraseñas en una base de datos, no limite la longitud del campo (es decir, use un campo varchar(255)
).
Solo por aclaración, me gustaría agregar a la respuesta que PHP usa la siguiente estructura. Por lo tanto, las funciones password_needs_rehash()
y password_verify()
verificará el algoritmo y el costo y hará su trabajo para mantener todo compatible y correcto.