Hola a todos! La semana pasada, publicamos la
primera parte de este artículo, que causó un holivar grave.
Una de las principales quejas fue la falta de mención de password_hash
en el artículo, como prometimos, la segunda parte de este material comenzará de la misma manera con el hash de password_hash
usando password_hash
. También le recordamos que la redacción de este artículo se inspiró en el lanzamiento de un nuevo grupo en el curso “Desarrollador PHP Backend” , pero este material no tiene nada que ver con el programa de capacitación.
Puede obtener más información sobre el programa de capacitación en la jornada de puertas abiertas y, con el ejemplo de un seminario web gratuito sobre el tema "ServerLess PHP" , puede evaluar el formato de las conferencias.
Quizás concluiremos este prefacio ya prolongado e iremos directamente al artículo.
Hash de contraseña con contraseña_hash
Esta función crea un hash de contraseña de acuerdo con los parámetros que establecemos para él. Utiliza un algoritmo unidireccional.
Podemos elegir qué tipo de algoritmo usar estableciendo una de las constantes de nuestra elección:
PASSWORD_DEFAULT
de PHP 5.5 usa Bcrypt como el algoritmo predeterminado. Sin embargo, con el tiempo, esto cambia a medida que se descubren algoritmos nuevos y más seguros u otros factores.PASSWORD_BCRYPT
crea un hash crypt()
. Usualmente contiene 60 caracteres, puede identificarse por su identificador en el formato "$ 2y $" .PASSWORD-ARGON2I
Argon2 es actualmente uno de los algoritmos de hashing más seguros. Solo está disponible si PHP se compiló con Argon2.PASSWORD_ARGON2ID
Este algoritmo hash también pertenece a la familia Argon2 y usa la versión de Argon2ID, no I. Para que funcione, también es necesario que PHP se compile usando Argon2.
Esta función también tiene un parámetro opcional, que consiste en una matriz asociativa que acepta varias claves de acuerdo con el algoritmo seleccionado.
Si prefiere usar Bcrypt, la clave de esta secuencia será el valor del costo.
Si elige un algoritmo que usa Argon2, las claves para la matriz asociativa serán:
memory_cost
(un entero que indica la cantidad máxima de memoria necesaria para calcular el hash),
time_cost
(un entero que indica el tiempo máximo necesario para calcular el hash) y
thread
(otro entero un número que indica el número de hilos utilizados para calcular el hash).
No especifique el parámetro
salt
en PHP 7.0, de lo contrario recibirá una advertencia sobre el enfoque obsoleto.
Ahora sabemos qué elementos son necesarios para usar la función
password_hash()
. Veamos cómo prescribirlo.
echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
Al principio, se recomienda probar esta función en sus servidores y configurar el parámetro de costo para que la ejecución de la función tome menos de 100 milisegundos en los sistemas interactivos.
El script en el ejemplo anterior lo ayudará a establecer el valor de costo óptimo para su hardware.
Verificación de contraseña de usuario
Ofreció a los usuarios la oportunidad de registrarse en su nueva aplicación, pueden ingresar su contraseña allí y usted sabe muy bien cómo manejar esta contraseña.
Al cifrar los datos de acuerdo con las últimas tendencias de seguridad, no almacena nada en forma cifrada y su servidor está oculto en un sótano de 10 metros de profundidad.
Que ahoraAhora debe permitir que los usuarios inicien sesión en la aplicación. Para hacer esto, PHP tiene una función incorporada que verifica la contraseña que coincide con la secuencia hash. Esta función se llama
password_verify()
. Funciona así:
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo ' !'; }
Ella tiene dos parámetros, y ambos deben tener un formato de secuencia. El primer parámetro es la contraseña que el usuario ingresó en el formulario de inicio de sesión de la cuenta. El segundo parámetro son los datos directamente en hash con los que consultaremos.
Como resultado, obtenemos un valor lógico, listo para usar en operaciones condicionales. Por lo tanto, podemos dejar que el usuario ingrese a la aplicación o informarle que algo salió mal.
Esta función funciona porque en el paso anterior (cuando teníamos la contraseña cifrada), el valor devuelto por
password_hash
incluía el algoritmo que usamos,
cost
y
salt
.
Por lo tanto, toda la información necesaria para
password_verify()
está disponible para nosotros.
El algoritmo del sistema de registro de usuarios en PHP
Espero que ahora comprenda las medidas de seguridad que los desarrolladores de PHP toman al manejar contraseñas.
Primero debe verificar una solicitud posterior, y luego seleccionar y calcular el número de usuarios cuyos datos coinciden con los ingresados.
Si todo salió bien, verificamos la contraseña y enviamos al usuario a la página de inicio. De lo contrario, por ejemplo, en Javascript mostramos una ventana de advertencia con una notificación de error.
Conclusión
Ahora sabe cómo garantizar la seguridad de su aplicación y cómo manejar las contraseñas correctamente. Seguir recomendaciones útiles no es solo un estándar que debe seguir, sino una ruta de desarrollo que debería ser agradable de seguir.
Aprenda nuevas técnicas similares a las que acaba de aprender. Agregue funcionalidades adicionales y experimente con el código hasta que obtenga excelentes habilidades de desarrollo web, ya sea PHP o cualquier otro lenguaje que ofrezca no menos oportunidades.
Lee la primera parte