La función password_hash() se utiliza para crear un hash de la contraseña.
Requisitos de la versión de PHP: PHP 5 >= 5.5.0, PHP 7
cadena contraseña_hash (cadena $contraseña, int $algo [, matriz $opciones])
contraseña_hash() crea un hash de la contraseña utilizando un algoritmo hash unidireccional suficientemente fuerte. contraseña_hash() es compatible con crypt(). Por lo tanto, los hashes de contraseña creados por crypt() también se pueden usar con contraseña_hash().
Algoritmos actualmente soportados:
PASSWORD_DEFAULT
: utiliza el algoritmo bcrypt (predeterminado en PHP 5.5.0). Tenga en cuenta que esta constante cambiará a medida que PHP agregue algoritmos más nuevos y potentes. Por lo tanto, la duración de los resultados generados utilizando esta constante cambiará en el futuro. Por tanto, la columna de la base de datos donde se almacenan los resultados puede superar los 60 caracteres (preferiblemente 255 caracteres).
PASSWORD_BCRYPT
: crea un hash utilizando el algoritmo CRYPT_BLOWFISH
. Esto da como resultado un crypt() compatible con "$2y$". El resultado será una cadena de 60 caracteres o FALSE
en caso de error.
PASSWORD_ARGON2I
: crea un hash utilizando el algoritmo hash Argon2.
Opciones admitidas por PASSWORD_BCRYPT:
salt(cadena): proporciona manualmente un valor de sal para aplicar hash a la contraseña. Esto evitará la generación automática de sal.
Cuando se omite este valor, contraseña_hash() genera automáticamente un valor salt aleatorio para cada hash de contraseña. Este modo de operación es intencional.
Nota: La opción salt está obsoleta a partir de PHP 7.0.0. Por ahora es mejor simplemente usar la sal generada por defecto.
costo (entero): representa el costo utilizado por el algoritmo. Hay ejemplos de valores de costos en la página crypt().
Cuando se omite, el valor predeterminado es 10. Este costo es un buen resultado final, pero es posible que pueda aumentar este valor según su propio hardware.
PASSWORD_ARGON2I opciones admitidas:
Memory_cost ( entero ): memoria máxima (unidad: byte) al calcular el hash Argon2. Valor predeterminado: PASSWORD_ARGON2_DEFAULT_MEMORY_COST
.
time_cost ( entero ): tiempo máximo dedicado a calcular el hash Argon2. Valor predeterminado: PASSWORD_ARGON2_DEFAULT_TIME_COST
.
subprocesos ( entero ): el número máximo de subprocesos que se utilizarán al calcular hashes de Argon2. Valor predeterminado: PASSWORD_ARGON2_DEFAULT_THREADS
.
Descripción del parámetro:
contraseña: un valor hash creado por contraseña_hash().
algo: una constante de algoritmo criptográfico utilizada para indicar el algoritmo utilizado al realizar hash de contraseñas.
opciones: una matriz asociativa que contiene opciones. Actualmente, se admiten dos opciones: salt, la sal (cadena de interferencia) agregada al aplicar hash a la contraseña, y cost, que se utiliza para especificar el número de niveles de recursividad del algoritmo. Se pueden encontrar ejemplos de estos dos valores en la página crypt().
Cuando se omite, se utilizará un valor de sal aleatorio y un costo predeterminado.
Devuelve la contraseña hash o FALSE en caso de error.
La salida es:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
La salida es:
$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K
Ejemplo de configuración manual del valor de sal
<?php /* * * Tenga en cuenta que el valor de sal aquí se genera aleatoriamente. * Nunca utilice un valor de sal fijo o un valor de sal que no se genere aleatoriamente. * * En la mayoría de los casos, puedes dejar que password_hash generate genere automáticamente un valor de sal aleatorio */ $opciones = [ ' costo ' => 11 , ' sal ' => mcrypt_create_iv ( 22 , MCRYPT_DEV_URANDOM ) , ] echo ; contraseña_hash ( " rasmuslerdorf " , PASSWORD_BCRYPT , $opciones ) ?> ;La salida es:
$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.
Ejemplo de Password_hash() para encontrar el mejor costo
<?php /* * * Este ejemplo realiza una prueba comparativa en el servidor para comprobar qué tan alto es el costo que puede soportar el servidor * El valor más alto se puede establecer sin ralentizar significativamente el servidor * 8-10 es un buen resultado final, en el servidor If es lo suficientemente rápido, cuanto más alto, mejor. * El siguiente código objetivo es ≤ 50 milisegundos (milisegundos), * adecuado para que el sistema maneje el inicio de sesión interactivo. */ $timeTarget = 0.05 ; // 50 milisegundos (milisegundos) $ coste = 8 ; { $costo ++; $inicio = microtiempo ( verdadero ) ; contraseña_hash ( " prueba " , CONTRASEÑA_BCRYPT , [ " costo " => $ costo ] ) ; $fin = microtiempo ( verdadero ) ; mientras ( ( $fin - $inicio ) < $ timeTarget ) ; " Costo apropiado encontrado: " $ costo ? >La salida es:
Costo apropiado encontrado: 10
Ejemplo usando Argon2:
<?php eco ' Hash Argon2: ' contraseña_hash ( ' rasmuslerdorf ' , CONTRASEÑA_ARGON2I ) ? > ;La salida es:
Hash de Argón2: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0