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