2011-04-21 136 views
0

我散列密码,值插入数据库的方式,为什么这个密码哈希和比较不起作用?

$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) 

两个哈希工作,但抛出的值不同?我正在使用完全相同的公式来创建和比较。

我正在接受用户密码,将其与当前日期进行腌制,然后进行哈希处理,两个值都存储在数据库中并进行比较,完成同样的事情,所有在线教程都是关于哈希和创建安全哈希,没有比较。

感谢

回答

5

是什么类型joined?如果它是MySQL并且正在使用DATE,那么它将打印为“YYYY-MM-DD”。你的盐很可能不同。您可能想要使用更安全的方式来密码。

可能的解决方案:

  1. joined一个字符串(VARCHAR MySQL中)。这有效,但效率较低,不会让您轻松地按日期排序/搜索。

  2. 准确匹配日期,因为您的SQL实施使用它。对于MySQL,例如,使用YYYY-MM-DD。另外,请在前面创建日期字符串,请勿在查询中拨打date('y/m/d')两次。先用日期创建一个变量(如“2011-04-21”),将其用于盐,并将其传递到joined,并且应该这样做。

  3. 使用UNIX_TIMESTAMP将日期转换为数字。没有必要的格式。

+0

我被告知在这里使用日期作为盐?这个主题有很多观点,我很难看到。 – Version1 2011-04-21 23:07:01

+0

你会如此善良分享你的腌制方法,谢谢你的答案。 – Version1 2011-04-21 23:14:45

+0

两件事:1.预先抓取日期,2.使用“加入”字符串,或者使用您认为与您的特定SQL实现完全匹配的格式。 – EboMike 2011-04-21 23:19:11

0

如果你存储joined为除varchar类型以外的东西,然后从数据库中获得的价值可能不匹配从date()函数的返回值。

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

2

我想在数据库中的joined列是DATEDATETIME列?如果是这样,你可能没有得到日期格式为y/m/d,但Y-m-d甚至Y-m-d H:i:s。您需要重新格式化才能获得相同的值。