Php 即使使用额外的字符,密码也可以工作

Php 即使使用额外的字符,密码也可以工作,php,passwords,crypt,Php,Passwords,Crypt,我有两种方法,我正在使用。当用户创建帐户时,我调用此方法来生成安全密码哈希,以便将其保存到数据库中: public function createPassword($password){ $salt = hash("sha256", time() . uniqid() . rand(1, 1000)); return crypt($password, $salt); } 它返回一个salt,然后我将其保存到password列中的数据库中 接下来,当用户登录到他/她的帐户时,我从

我有两种方法,我正在使用。当用户创建帐户时,我调用此方法来生成安全密码哈希,以便将其保存到数据库中:

public function createPassword($password){
    $salt = hash("sha256", time() . uniqid() . rand(1, 1000));
    return crypt($password, $salt);
}
它返回一个salt,然后我将其保存到password列中的数据库中

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

public function verifyPassword($password, $salt){
    if(crypt($password, $salt) == $salt){
        return true;
    }
    return false;
}
问题是,我发现了一个密码,如果我在其中输入正确的密码,它就可以工作,但是如果我在密码末尾添加额外的字符,它仍然可以工作。这不应该发生。我是做错了什么,还是这是php中的一个bug

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

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

以下是我的测试:

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

因此,只要字符串以真实密码开头,后面的任何内容都可以……

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

如果是这样,则任何超过8的字符都将被截断


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

这是因为我使用的是crypt,正如这里的描述:说明不要使用
=
==
因为它不起作用是的,我使用的是8个字符的字符串。PHP建议我使用
password\u hash
password\u verify
。你认为这会有帮助吗?我想是的,因为它使用72个字符和更强的加密。好问题,我不知道为什么会被否决…@jpp我不想使用
MD5
,因为它不是一个非常安全的散列方法,
password\u hash
每次都会在同一个密码上返回不同的散列,使其更难解密,但感谢链接!
abc123          // Works
abc12           // doesn't work
abc12jfjf       // doesn't work
abc123123       // Works
abc123asdfadffa // Works