Ho lavorato su un sito che richiede l'accesso da parte degli utenti. È scritto in PHP con MySQL e le password sono memorizzate come hash Whirlpool con un salt (codice sorgente più tardi).
Tuttavia, i siti di sicurezza o altri sviluppatori lo hanno sconsigliato (in realtà, SHA-256, ma il punto rimane) e hanno consigliato bcrypt o PBKDF2. Non sono sicuro dei vantaggi dell'utilizzo di uno di questi o del perché quello corrente è sbagliato. Qualcuno ha in mente di spiegare il loro ragionamento?
Ecco il mio codice da registrare:
$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"];
Ecco il mio codice di accesso:
$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.";
}