因此,我正在学习PHP并正在登录页面上工作。我已经想出了如何使用SHA256注册新用户来散列$ salt + $密码。我知道像bcrypt这样的加密方法较慢,但为了学习目的,我只使用SHA256。我的问题是,使用这种加密后:从数据库检索salt + hash进行验证
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;
}
是的,我理解这个概念,并感谢你的额外澄清。绊倒我的是我如何访问我的数据库中的串联散列。从用户密码中选择username ='$ username'? – Jukodan 2012-04-27 07:38:59
@Jukodan你可以做一个单一的查询来检索salt和散列密码:'SELECT hashedPW,salt FROM users WHERE username ='$ username''。然后用PHP完成比较。重要的一点是为每个用户使用不同的盐,而不是全球用户(对另一个答案的评论听起来像对所有用户只有一个“盐”)。 – Sirko 2012-04-27 07:41:40
啊!我一直在想它,主要是因为当我查询数据库并回应我收到“资源ID#2”的结果而不是预期的散列密码时。目前我正在使用: $ salt = bin2hex(mcrypt_create_iv(32,MCRYPT_DEV_URANDOM)); 为每个用户生成一个随机salt,然后将hash = salt + password存储在一列中。 – Jukodan 2012-04-27 07:46:18