He estado trabajando en un sitio que requiere que los usuarios inicien sesión. Está escrito en PHP con MySQL, y las contraseñas se almacenan como hash de Whirlpool con un salt (código fuente más adelante).
Sin embargo, los sitios de seguridad o los otros desarrolladores han desaconsejado esto (en realidad, SHA-256, pero el punto sigue siendo) y han recomendado bcrypt o PBKDF2. No estoy seguro de las ventajas de usar uno de estos o por qué el actual es incorrecto. ¿A alguien le importa explicar su razonamiento?
Aquí está mi código para registrarme:
$escusrnm = $con->real_escape_string($_POST["usrnm"]);
$newSalt = substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31);
$passHashed = hash("whirlpool", $_POST["pss"].$newSalt);
$con->query("INSERT INTO users (username, pass, hash) VALUES ('{$escusrnm}', '{$passHashed}', '{$newSalt}')");
$_SESSION["usernm"] = $_POST["usrnm"];
Aquí está mi código de inicio de sesión:
$escusrnm = $con->real_escape_string($_POST["usrnm"]);
$getdats = $con->query("SELECT * FROM users WHERE username='{$escusrnm}'");
if (mysqli_num_rows($getdats) > 0) {
$getdats = $getdats->fetch_assoc();
if(hash("whirlpool", $_POST["pss"].($getdats["hash"])) == $getdats["pass"]) {
$_SESSION["usernm"] = $getdats["username"];
} else {
$errormsg = "There was an error. Check your information again, or register.";
}
} else {
$errormsg = "There was an error. Check your information again, or register.";
}