所以我正在学习PHP并正在处理登录页面。我已经想出了如何使用 SHA256 注册新用户来散列 $salt+$password。我知道有较慢的加密方法,如 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;
}
原则是无法检索密码;而是使用相同的HashPassword
函数来计算密码尝试的哈希,然后查询数据库以查找匹配的记录。
编辑
再看看你的HashPassword
函数,我意识到你不想在其中生成随机盐,而是把$salt
作为一个参数;你要么从现有的数据库记录中传入值,要么传入随机生成的值,视情况而定。
您基本上保存用盐散列的密码以使其无法识别。
如果您的数据库在某个时候被黑客入侵,黑客无法直接读取密码。相反,他将不得不重新创建哈希值。
如果您不为每个用户使用不同的(随机)盐,黑客只需创建一个包含所有可能的哈希值的表,并将其与您保存的哈希密码进行比较。
但是,如果每个密码在密码中添加了不同的盐,则在散列之前,黑客必须为每个密码创建一个新表,从而大大增加了获取真实密码所需的工作量。人们希望这将使黑客效率低下或成本太高。
对于想要验证登录凭据的编码人员,您必须遵循以下模式:
- 获取保存在数据库中的盐。
- 计算串联
hash = salt + password
的 has 值 - 将计算出的具有与保存的进行比较
hash === savedHash
- 如果它们相同,则为有效密码。如果不是,则密码错误。