0

如果您在我的网站上注册,我正在尝试对密码进行哈希处理,但它不起作用。这是我在注册时散列密码的代码:

$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'];
}

我希望这不是太多的代码,我也希望你能理解我的问题。

4

3 回答 3

1

salt抱歉,我无法发表评论,但有消息告诉我,您的数据库中的列存在长度限制。

示例:salt 字段可能只允许 64 个字符,而生成的 salt 可能更长,因此当您保存 salt 时,它会被修剪,最终会更改散列密码。

如果是这种情况,您可能需要在保存之前修剪盐。

我建议使用PDO对您的数据库进行查询。

于 2013-03-13T21:27:07.557 回答
1

由于某种原因,您对哈希函数的输入必须不同。

在对两个用例(创建用户和登录)进行哈希处理之前,添加打印输入的日志输出消息。还要确保在日志中的输入周围加上引号以显示空格问题。

比较两种情况下的原始输入和散列函数的输出,会有所不同。如果没有差异,并且哈希的输出相同,那么您的查询中存在问题,即在登录案例中查找用户。

于 2013-03-13T21:34:39.897 回答
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; }
}
于 2013-03-13T21:19:56.813 回答