php - password_bcrypt - password_verify
¿Cómo uso el hashing de contraseñas con PDO para hacer que mi código sea más seguro? (3)
Mi código realmente funciona pero no es del todo seguro, no quiero usar MD5 ya que no es tan seguro. He estado buscando el hash de contraseña, pero no estoy seguro de cómo lo incorporaría a mi código.
Iniciar sesión:
require_once __DIR__.''/config.php'';
session_start();
$dbh = new PDO(''mysql:host='' . DB_HOST . '';dbname='' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);
$sql = "SELECT * FROM users WHERE username = :u AND password = :p";
$query = $dbh->prepare($sql); // prepare
$params = array(":u" => $_POST[''username''], ":p" => $_POST[''password'']);
$query->execute($params); // execute
$results = $query->fetchAll(); // then fetch
//hash passwords pls
if (count($results) > 0 ){
$firstrow = $results[0];
$_SESSION[''username''] = $firstrow[''username''];
echo "Hello $username you have successfully logged in";
//header ("location:.php");
}
else{
echo "Login Has Failed";
return;
}
Registro:
$dbh = new PDO(''mysql:host='' . DB_HOST . '';dbname='' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$stmt = $dbh->prepare("insert into users set username=''".$username."'', email=''".$email."'', password=''".$password."'' ");
$stmt->execute();
echo "<p>Thank you, you are registered</p>";
¿Alguien podría mostrarme cómo incorporarlo al código que tengo?
Básicamente, tiene dos opciones, que varían en complejidad:
- Almacene un hash de la contraseña del usuario registrado, utilizando un algoritmo de hash de su elección (más sobre esto más adelante).
- cree una sal aleatoria (una cadena constante y secreta) para usar junto con la contraseña del usuario, para crear el hash como se indicó anteriormente y luego almacenar ese hash en la base de datos.
Cuando recupera el registro de usuario, compara el hash calculado a partir de la contraseña proporcionada, con el hash almacenado en la base de datos.
Ejemplo:
$HashedPass = hash(''sha512'', $password);
o con una SAL predefinida:
$HashedPass = hash(''sha512'', $password.SALT_STRING);
Almacene esto en la base de datos como lo hizo antes.
Autenticando de manera similar:
$HashedPass = hash(''sha512'', $password.SALT_STRING);
y luego recuperar de la base de datos basada en esa comparación de hash con la almacenada.
Ahora, me gustaría abordar sus inquietudes sobre los algoritmos de hash: no tiene que usar md5, también puede usar algoritmos de hash más seguros, consulte un comentario aquí: la función hash de PHP Una sugerencia es usar el algoritmo sha512.
Lo que es más importante, debe comprender que el hash es una conversión unidireccional : no hay una forma práctica de aplicar ingeniería inversa a la contraseña original solo del hash, solo tal vez encontrar cadenas alternativas, que producen la misma cadena hash.
Espero que el uso de un algoritmo Hash fuerte, junto con un Salt para mitigar el daño de un Hash DB robado, sea lo suficientemente bueno para sus necesidades.
Solo usa una biblioteca. Seriamente. Existen por una razón.
-
PHP 5.5+: use
password_hash()
-
PHP 5.3.7+: use
password-compat
(un paquete de compatibilidad para arriba) - Todos los demás: use PHPass
No lo hagas tú mismo. Si estás creando tu propia sal, lo estás haciendo mal . Debería estar usando una biblioteca que maneje eso por usted.
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
Y al iniciar sesión:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST[''username'']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST[''password''], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
Sobre cómo hacer que su código sea más seguro :
- SIEMPRE debe validar las entradas de usuario, incluso desde un método POST que se puede cambiar utilizando firebug antes de enviar el formulario. A medida que inserta la entrada del usuario en una consulta , es mucho más importante.
Sobre tu pregunta en general
Como te aconsejé en el comentario, usa PHPass o API ya hechas que harán el trabajo por ti.
Hash el nombre de usuario, pass y salt en el momento de la creación de la cuenta e inserta el hash en la base de datos.
En el momento de la autenticación, regenerará un hash con el inicio de sesión y la entrada de contraseña proporcionados y la información que agregó para generar la sal.
Si ambos hashes generados coinciden, el usuario se autentica.
EDITAR: Sí, password_hash también es bueno.