【问题标题】:Password works even with extra characters密码甚至可以使用额外的字符
【发布时间】:2015-01-18 04:45:17
【问题描述】:

我正在使用两种方法。当用户创建帐户时,我调用此方法为他们创建安全密码哈希以保存到数据库中:

public function createPassword($password){
    $salt = hash("sha256", time() . uniqid() . rand(1, 1000));
    return crypt($password, $salt);
}

它返回一个盐,然后我将它保存到密码列中的数据库中。

接下来,当用户登录他/她的帐户时,我从数据库中选择他们的信息并将其传递给该函数,然后该函数应该验证他们的密码。

public function verifyPassword($password, $salt){
    if(crypt($password, $salt) == $salt){
        return true;
    }
    return false;
}

问题是我找到了一个密码,如果我输入正确的密码,它就可以工作,但是如果我在密码的末尾添加额外的字符,它仍然可以工作。这不应该发生。我做错了什么还是这是php中的错误?

为了安全起见,我没有使用下面的真实密码

// Create during registration
$salt = $obj->createPassword('abc123');
// Save to database here

然后:

// Get row from database save array $row
if($obj->verifyPassword($_POST["passwd"], $row["password"])){
    // Log user in
}

这是我的测试:

abc123          // Works
abc12           // doesn't work
abc12jfjf       // doesn't work
abc123123       // Works
abc123asdfadffa // Works

所以,看起来只要字符串以真实密码开头,后面的任何内容都可以......

【问题讨论】:

标签: php passwords crypt


【解决方案1】:

这可能取决于您使用的加密方法。在您的示例中,您使用的实际密码是 8 个字符吗?

如果是这样,那么任何超过第 8 位的字符都会被截断。

https://bugs.php.net/bug.php?id=11240

要避免这种行为,请使用 MD5 加密。

【讨论】:

  • 是的,我使用的是 8 个字符的字符串。 PHP 建议我改用password_hashpassword_verify。你认为这会有所帮助吗?
  • 我认为是这样,因为它使用 72 个字符和更强大的加密。好问题,但我不确定为什么它被否决了......
  • @jpp 我不想使用MD5,因为它不是一种非常安全的哈希方法,password_hash 每次使用相同的密码都会返回不同的哈希值,因此更难解密,但是感谢您的链接!
猜你喜欢
  • 2015-11-20
  • 2013-10-06
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多