我对密码进行哈希并将值插入数据库的方式
$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)
两个哈希都有效但却抛弃了不同的值?我使用完全相同的公式进行创建和比较。
我正在获取用户密码,将其与当前日期一起使用,然后散列,两个值都存储在数据库中,并且在完成同样的事情时进行比较,所有在线教程都是关于散列和创建安全哈希,而不是比较
由于
答案 0 :(得分:5)
joined
是什么类型的?如果它是MySQL并且你正在使用DATE,那么它将打印为“YYYY-MM-DD”。你的盐很可能不同。您可能希望使用更简单的方法来填写密码。
可能的解决方案:
使joined
成为一个字符串(MySQL中的VARCHAR)。这样做有效,但效率较低,不允许您按日期轻松排序/搜索。
在SQL实现使用日期时精确匹配日期。例如,对于MySQL,请使用YYYY-MM-DD。另外,请事先创建日期字符串,不要在查询中调用date('y/m/d')
两次。使用日期创建一个变量(如“2011-04-21”),将其用于盐,将其传递给joined
,这应该可以。
使用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()
和数据库中提取的值。