如果您在我的网站上注册,我正在尝试哈希密码,但它不起作用。 这是我在注册时哈希密码的代码:
$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$hashedPW = hash('sha256', $escapedPW . $salt);
然后我只是将它插入数据库(散列密码和盐)。
例如,当我使用以下盐哈希Sas
时:
abac7ad23185ad19967f0d13e962197962782f0b7ec32d9889c27a93a9e800fa
这是哈希密码:
8ca5c5f31fafbf382533dbcbfc22b3635d776ec7770c7eac58d8ef9f1fa3613c
但是当我尝试在登录时使用完全相同的密码和盐来密码密码时,这就变成了散列传递:
6eb4b16444f18cee19db32bd29a39970e3019c5b1972a982ae4cb9a59642dffc
这是我用来登录的代码:
$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = mysql_query("SELECT salt FROM members WHERE user='{$escapedName}'");
while($result = mysql_fetch_assoc($saltQuery)) {
$salt = $result['salt'];
}
$hashedPW = hash('sha256', $escapedPW . $salt);
$sql = mysql_query("SELECT * FROM members WHERE user='$escapedName' AND pass='$hashedPW'; ");
while ($res = mysql_fetch_assoc($query2)) {
$username = $res['user'];
$PW = $res['pass'];
}
我希望代码不是太多,我也希望你能理解我的问题。
答案 0 :(得分:1)
很抱歉,我无法发表评论,但有些事情告诉我数据库中的salt
列存在长度限制。
示例:盐场可能只允许64个字符,而生成的盐可能更长,因此当您保存盐时,它会被修剪,最终会更改散列密码。
如果是这种情况,您可能需要在保存之前修剪盐。
我建议使用PDO对您的数据库进行查询。
答案 1 :(得分:1)
由于某种原因,您对哈希函数的输入必须不同。
在散列两个用例(创建用户和登录名)之前,添加打印输入的日志输出消息。还要确保在日志记录中输入引号以显示空白问题。
在两种情况下比较原始输入以及散列函数的输出,并且在某处会有差异。如果没有差异,并且哈希的输出相同,那么查询中的问题是在登录案例中查找用户。
答案 2 :(得分:0)
无论你做什么,如果你想要哈希是一样的话,这是不安全的!有关正确的密码哈希,请参阅http://php.net/crypt。
所有你需要的:
function check_password($password) {
...//get db password to compare
if (crypt($post_password, $db_results[0]['password']) == $db_results[0]['password']) {
return true;
} else { return false; }
}