Hashing de contraseñas en PHP

Olorunfemi Akinlua 30 enero 2023
  1. Hashing de contraseñas en PHP
  2. Utilice password_hash() y password_verify() para el hashing de contraseñas en PHP
Hashing de contraseñas en PHP

PHP se usa para el desarrollo del lado del servidor, y necesitará contraseñas al crear procesos de inicio de sesión y registro. Por motivos de seguridad y cuestiones de privacidad, necesitamos codificar nuestras contraseñas para que nadie (incluido usted y el administrador de la base de datos) pueda conocer la contraseña de un usuario.

Sin embargo, cuando hacemos hash de la contraseña, necesitamos volver a hacerlo cuando queremos que la persona inicie sesión. Este artículo detalla qué hash de contraseña y cómo usar las funciones integradas de PHP, password_hash() y password_verify() .

Hashing de contraseñas en PHP

Los datos recopilados de los usuarios se almacenan en bases de datos, que son visibles para cualquier persona con acceso a la base de datos. Los nombres de usuario y las direcciones a menudo se dejan como están; no son tan importantes como la clave de sus cuentas.

La cadena de texto que es la contraseña del usuario se pasa a través de algoritmos hash (bcrypt, md5, sha-1, sha-2) para evitar guardar las contraseñas tal como están y crear una representación codificada del texto. Esta representación codificada de la contraseña se almacena y, durante los procesos de inicio de sesión, se compara la representación codificada.

La función incorporada password_hash() hace uso del algoritmo bcrypt que es lo que Auth0 recomienda y usa para su base de clientes. Además, la función password_verify() compara el texto de la contraseña con el hash y devuelve un valor booleano cuando la contraseña coincide con un hash.

Utilice password_hash() y password_verify() para el hashing de contraseñas en PHP

Cuando un usuario ingresa a su sitio y crea una nueva cuenta, usted, como desarrollador de PHP, se asegurará de que su aplicación obtenga la contraseña. Para ello, aplicamos la función password_hash().

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

La salida del fragmento de código es:

$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.

El fragmento de código utiliza el algoritmo hash predeterminado que, según la documentación de PHP, utiliza el algoritmo bcrypt. Si pretendemos cambiar el algoritmo hash, podemos cambiar el segundo argumento de la función.

Hay otros tres argumentos posibles (algoritmo hash) que podemos usar. Los argumentos PASSWORD_BCRYPT, PASSWORD_ARGON2I y PASSWORD_ARGON2ID son compatibles.

El PASSWORD_BCRYPT utiliza el algoritmo CRYPT_BLOWFISH, PASSWORD_ARGON2I utiliza el algoritmo hash Argon2i y PASSWORD_ARGON2ID utiliza el algoritmo hash Argon2id. Para comprender mejor cómo funciona cada algoritmo, consulte la documentación de hash de contraseña de PHP.

Probemos el parámetro PASSWORD_BCRYPT en nuestro código.

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

La salida del fragmento de código es:

$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO

Tanto PASSWORD_DEFAULT como PASSWORD_BCRYPT utilizan el identificador $2y$ y producirán una cadena de 60 caracteres. Con el proceso anterior, hemos cifrado con éxito la contraseña del usuario.

Ahora, si el usuario desea iniciar sesión en su cuenta, debemos comparar la contraseña que ingresó con la contraseña codificada. Ahí es donde entra en juego password_verify().

Podemos comparar la contraseña y la contraseña hash almacenada con la función integrada.

<?php

$password = "24FE21121@1*?";
$hashed_password ='$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.';

print_r(password_verify($password, $hashed_password));

?>

La salida del fragmento de código es:

1

En PHP, 1 representa true y 0 representa false.

Probemos la función password_verify() en la contraseña hash producida por el parámetro PASSWORD_BCRYPT.

<?php

$password = "24FE21121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

print_r(password_verify($password, $hashed_password));

?>

La salida del fragmento de código es:

1

La razón por la que la función password_verify() puede funcionar independientemente de la contraseña hash que usemos es porque la función verifica las coincidencias hash dadas que son compatibles con crypt(), que es ambas cosas. Además, las funciones devuelven el algoritmo, el costo y la sal como parte del hash devuelto y son seguras contra ataques de sincronización.

Para mejorar su resultado hash, especifique las opciones de costo y sal en la función password_hash(). Sin embargo, si no entiende cómo usarlo, puede afectar en gran medida su seguridad.

Para comprobar si la función password_verify() detectará una contraseña incorrecta, coloquemos una contraseña incorrecta (cambie de 24FE21121@1*? a 24Fqqw1121@1*?).

<?php

$password = "24Fqqw1121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

if (password_verify($password, $hashed_password)) {
    echo "Password Matches!";
} else {
    echo "Wrong Password";
}

?>

La salida del fragmento de código es:

Wrong Password

Si lo usamos dentro del contexto de un proceso de inicio de sesión real, el código podría verse así:

<?php
$connect = mysqli_connect($localhost, $username, $password, $database);

if (isset($_POST['submit'])) {
    extract($_POST);

    // retrive stored hashed password
    $sqlQuery = mysqli_query($connect, "SELECT * FROM USERTABLE WHERE USER='$username'");
    $fetch = mysqli_fetch_array($sqlQuery);
    $currentPassword = $fetch['hashPassword'];

    if (password_verify($enteredPassword, $currentPassword)) {
        // password matches
        $_SESSION['id'] = $fetch['id'];
        header("location: home.php");
    } else {
        // password doesn't match
        $output = "Wrong Passworfd";
    }
}
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Artículo relacionado - PHP Password