为什么这个密码哈希和比较不起作用?

时间:2011-04-21 22:54:28

标签: php

我对密码进行哈希并将值插入数据库的方式

$q = $dbc -> prepare("INSERT INTO accounts (username, email, password, type, gender, joined)
                      VALUES (?, ?, ?, ?, ?, ?)");
$q -> execute(array($_POST['username'], $_POST['email'], 
                    hash('sha256', $_POST['password'] . date('y/m/d')), 
                    $_POST['type'], $_POST['gender'], date('y/m/d')));

当我像这样比较时,

if ($count == 1 
&& $info['password'] === hash('sha256', $_POST['password'].$info['joined'])
&& $info['logcount'] != -1)

两个哈希都有效但却抛弃了不同的值?我使用完全相同的公式进行创建和比较。

我正在获取用户密码,将其与当前日期一起使用,然后散列,两个值都存储在数据库中,并且在完成同样的事情时进行比较,所有在线教程都是关于散列和创建安全哈希,而不是比较

由于

3 个答案:

答案 0 :(得分:5)

joined是什么类型的?如果它是MySQL并且你正在使用DATE,那么它将打印为“YYYY-MM-DD”。你的盐很可能不同。您可能希望使用更简单的方法来填写密码。

可能的解决方案:

  1. 使joined成为一个字符串(MySQL中的VARCHAR)。这样做有效,但效率较低,不允许您按日期轻松排序/搜索。

  2. 在SQL实现使用日期时精确匹配日期。例如,对于MySQL,请使用YYYY-MM-DD。另外,请事先创建日期字符串,不要在查询中调用date('y/m/d')两次。使用日期创建一个变量(如“2011-04-21”),将其用于盐,将其传递给joined,这应该可以。

  3. 使用UNIX_TIMESTAMP将日期转换为数字。无需格式化。

答案 1 :(得分:2)

我猜数据库中的joined列是DATE还是DATETIME列?如果是这样,您可能无法将日期格式设置为y/m/d,而是Y-m-d甚至Y-m-d H:i:s。您需要重新格式化以获得相同的值。

答案 2 :(得分:0)

如果您将joined存储为varchar类型之外的其他内容,则从数据库获取的值可能与date()函数返回的值不匹配。

joined存储为纯文本或使用可以从date()和数据库中提取的值。