哈希密码功能无法正常工作

时间:2013-08-29 16:55:33

标签: php mysql hash

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

似乎当我用正确的用户密码执行我的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);
}

2 个答案:

答案 0 :(得分:2)

  

有人可以就我做错的事情向我提出意见吗?

不要冒犯你,但你真的在犯所有错误。让我们从头开始:

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

这是一种计算盐的非常差的方法。从rand man page开始:

  

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

就在那里,你的整个机制崩溃了。安全性与其最弱的组件一样好。但它并不止于此。 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()以验证哈希值。

答案 1 :(得分:0)

您应该像执行生成器功能一样将SALT_LENGTH置于检查功能中。 。 手动检查它们是不同的还是相同的?