0

我在使用以下代码登录用户时遇到问题。

似乎当我使用正确的用户密码执行 if 语句时,用户输入的密码和我的数据库中的密码不匹配。有人可以就我做错的事情给我意见吗?

$pwd = hashed password in my database

$pass = password users enter on logi page



 if ($pwd === PwdHash($pass,substr($pwd,0,9))) {



 function PwdHash($pwd, $salt = null)
{
  if ($salt === null)     {
    $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
  }
else     {
    $salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($pwd . $salt);
}
4

2 回答 2

2

有人可以就我做错的事情给我意见吗?

不是冒犯你,但你确实做错了一切。让我们从头开始:

$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);

这是计算盐的一种非常糟糕的方法。直接从rand手册页

此函数不会生成加密安全值,并且不应用于加密目的。

就在那里,你的整个机制崩溃了。安全性与其最薄弱的部分一样好。但它并不止于此。uniqid()创建一个唯一的 id,但是这样做的主要问题是它基于当前时间。拥有独特的盐是好的,但由于它是严格基于时间的,因此可以预测,这是非常糟糕的,远远超过拥有独特的好处。

接下来,你 md5 盐。这在安全性方面绝对没有增加任何东西,并且可能会争论它实际上由于 md5 冲突而降低了安全性。

现在谈谈你如何散列你的密码:

$salt . sha1($pwd . $salt);

Sha1 非常快,因此对于密码散列来说是一个非常糟糕的选择。做salt . fastHash(password . salt)只是默默无闻的安全,根本不是安全。


那么你应该怎么做?

第一步:停止使用自己的密码散列机制,将其交给比你我更聪明的专家。

第二步:使用password_hash。如果您没有 PHP 5.5,请检查该页面上的注释以获取与早期版本兼容的兼容性库。就像这样做一样简单:

$hash = password_hash("someAmazingPassword", PASSWORD_DEFAULT);

然后查看password_verify()以验证哈希。

于 2013-08-29T17:30:05.513 回答
0

您应该像在生成器函数中一样将 SALT_LENGTH 放入您的检查函数中。. 手动检查它们是不同的还是相同的?

于 2013-08-29T17:08:58.370 回答