Registro de usuarios con contraseña encriptada

por

en

Cuando estamos creando una base de datos donde guardamos datos de usuario es muy importante no dejar en texto plano determinados campos.

Por ir a un ejemplo muy clásico y sencillo, el password de los usuarios no debería verse en texto plano en nuestra base de datos, de esta manera mejoraremos un poco nuestra seguridad.

Para guardar datos encriptados en base de datos hay muchas maneras, pero en este artículo vamos a ver como se puede hacer haciendo uso de PHP, en concreto la función password_hash.

Esta función, nos creará un hash de la contraseña que le pasemos como parámetro.

password_hash(string $password, string|int|null $algo, array $options = []): string

Parámetros de entrada de la función password_hash

Password: la palabra que queremos encriptar, en nuestro caso de ejemplo será el password que ponga el usuario en el formulario de contacto.

Algo: Constante que indica el algoritmo que vamos a utilizar para encriptar la contraseña, podemos ver más información sobre estas constantes aquí: https://www.php.net/manual/es/password.constants.php

Opciones: Un array asociativo con distintas opciones que acepta cada algoritmo de encriptación, en la página anterior se puede ver información al respecto.

Parámetro de salida de la función password_hash

Como es de esperar, la función password_hash nos devuelve el hash de la contraseña que le hemos introducido, por lo tanto, debemos capturar el resultado devuelto y trabajar con él como proceda.

$pass_has = password_hash("123456", PASSWORD_DEFAULT)

Ejemplo formulario registro html y php

Aquí tenemos un ejemplo donde simplemente vamos a registrar en nuestra base de datos el nombre y contraseña de una persona que se ha registrado en nuestra web.

Por supuesto vamos a hacer uso de la función password_hash para encriptar los datos sensibles mediante PHP.

Código HTML del formulario creado

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Registro de Usuario</title>
</head>
<body>
    <h2>Registro de Usuario con pass encriptado</h2>
    <form action="insert.php" method="post">
        <label for="username">Usuario:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">Contraseña:</label>
        <input type="password" id="password" name="password" required><br><br>
        <input type="submit" value="Registrarse">
    </form>
</body>
</html>

Código PHP de la página insert.php, indicada en el atributo action de nuestro formulario anterior:

// Conexión a la base de datos
$servername = "servidor";
$username = "usuario";
$password = "password";
$dbname = "nombrebbdd";

$conn = new mysqli($servername, $username, $password, $dbname);

// Verificar conexión
if ($conn->connect_error) {
    die("Error en la conexión: " . $conn->connect_error);
}

if (empty($_POST['username']) || empty($_POST['password'])) {
    die("Nombre de usuario y contraseña son obligatorios");
}

// Obtener datos del formulario
$username = $_POST['username'];
$password = $_POST['password'];

$hashed_password = password_hash($password, PASSWORD_DEFAULT); // Encriptar la contraseña

// Insertar datos en la base de datos
$sql = "INSERT INTO users (username, password) VALUES ('$username', '$hashed_password')";

if ($conn->query($sql) === TRUE) {
    echo "Usuario registrado exitosamente";
} else {
    echo "Error al registrar el usuario: " . $conn->error;
}

$conn->close();

Puedes encontrar toda la información sobre la función password_hash en https://www.php.net/manual/es/function.password-hash.php

Formulario de inicio de sesión y verificar contraseñas en PHP

Una vez tenemos guardados los datos encriptados, en nuestro caso ha sido el password, vamos a ver como podemos comprobar en un formulario de inicio de sesión si el usuario ha puesto la contraseña correctamente.

Como siempre, PHP nos da la solución, la función password_verify será la encargada de comprobar que la contraseña introducida coincide con el hash almacenado en nuestra base de datos.

password_verify(string $password, string $hash): bool

Parámetros de entrada de la función password_verify

Password: La contraseña del usuario.

Hash: hash creado por password_hash().

Parámetro de salida de la función password_verify

La función devuelve verdadero o falso (true o false) dependiendo si la contraseña introducida por el usuario es correcta o no.

Ejemplo formulario login html y php

Vamos a empezar por la creación de un formulario HTML con usuario y contraseña:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Iniciar Sesión</title>
</head>
<body>
    <h2>Iniciar Sesión</h2>
    <form action="login.php" method="post">
        <label for="username">Usuario:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">Contraseña:</label>
        <input type="password" id="password" name="password" required><br><br>
        <input type="submit" value="Iniciar Sesión">
    </form>
</body>
</html>

El código del archivo login.php debería ser algo así:

// Conexión a la base de datos
$servername = "servidor";
$username = "usuario";
$password = "password";
$dbname = "nombrebbdd";

$conn = new mysqli($servername, $username, $password, $dbname);

// Verificar conexión
if ($conn->connect_error) {
    die("Error en la conexión: " . $conn->connect_error);
}

// Obtener datos del formulario
$username = $_POST['username'];
$password = $_POST['password'];

// Buscar el usuario en la base de datos para conseguir el hash almacenado
// Observe que password_hash() devuelve el algoritmo, el coste y el salt como parte del hash devuelto
$sql = "SELECT * FROM users WHERE username='$username'";
$result = $conn->query($sql);

//si devuelve un registro el usuario existe
if ($result->num_rows == 1) {
    // recuperamos el primer registro devuelto
    $row = $result->fetch_assoc();
    // llamamos a la función que haga la comparación
    if (password_verify($password, $row['password'])) {
        echo "Inicio de sesión correcto";
    } else {
        echo "Contraseña incorrecta";
    }
} else {
    echo "Usuario no encontrado";
}

$conn->close();

Puedes encontrar toda la información sobre la función password_hash en

https://www.php.net/manual/es/function.password-verify.php

https://www.php.net/manual/es/faq.passwords.php