所以我正在学习PHP并正在登录页面。我已经想出如何使用SHA256注册一个新用户来哈希$ salt + $密码。我知道有更慢的加密方法,如bcrypt,但出于学习目的,我只是使用SHA256。我的问题是,在使用它加密后:
function HashPassword($password) {
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$hash = hash("sha256", $salt . $password); column
$final = $salt . $hash;
return $final;
}
使用预准备语句,从数据库中检索哈希密码的最佳方法是什么,以便我可以使用这样的函数对其进行验证?
function ValidatePassword($password, $hash_pass) {
$salt = substr($hash_pass, 0, 64);
$trueHash = substr($hash_pass, 64, 64);
$reHash = hash("sha256" , $salt . $password);
return $reHash == $trueHash;
}
答案 0 :(得分:5)
原则是你 cant 检索密码;相反,您使用相同的HashPassword
函数来计算密码尝试的哈希值,然后查询数据库以查找匹配的记录。
修改强>
再次查看你的HashPassword
函数,我意识到你不想在其中生成随机盐,而是以$salt
作为参数;您将从现有数据库记录中传入值,或者根据需要传入随机生成的值。
答案 1 :(得分:1)
您基本上使用salt保存密码哈希,使其无法识别。
如果您的数据库在某些时候被黑客攻击,黑客无法直接读取密码。相反,他将不得不重新创建散列值。
如果您不为每个用户使用不同的(随机)盐,则黑客只需创建一个包含所有可能哈希值的表,并将其与您保存的哈希密码进行比较。
但是,如果每个密码在密码中添加了不同的盐,则在散列之前,黑客必须为每个密码创建一个新表,从而增加了获取真实密码所需的工作量。人们希望这对黑客来说效率低或成本太高。
对于想要验证登录凭据的编码员,您必须遵循以下模式:
hash = salt + password
hash === savedHash