密码即使有额外的字符也能正常工作
Password works even with extra characters
我正在使用两种方法。当用户创建帐户时,我调用此方法为他们创建安全密码哈希以保存到数据库中:
public function createPassword($password){
$salt = hash("sha256", time() . uniqid() . rand(1, 1000));
return crypt($password, $salt);
}
它 returns 一个盐,然后我将其保存到密码列中的数据库中。
接下来,当用户登录 his/her 帐户时,我会 select 从数据库中获取他们的信息并将其传递给此函数,然后该函数将验证他们的密码。
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
所以,看起来只要字符串以真实密码开头就可以了...
这可能取决于您使用的加密方法。在您的示例中,您实际使用的密码是 8 个字符吗?
如果是,则第 8 个之后的所有字符都将被截断。
https://bugs.php.net/bug.php?id=11240
要避免这种行为,请使用 MD5 加密。
我正在使用两种方法。当用户创建帐户时,我调用此方法为他们创建安全密码哈希以保存到数据库中:
public function createPassword($password){
$salt = hash("sha256", time() . uniqid() . rand(1, 1000));
return crypt($password, $salt);
}
它 returns 一个盐,然后我将其保存到密码列中的数据库中。
接下来,当用户登录 his/her 帐户时,我会 select 从数据库中获取他们的信息并将其传递给此函数,然后该函数将验证他们的密码。
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
所以,看起来只要字符串以真实密码开头就可以了...
这可能取决于您使用的加密方法。在您的示例中,您实际使用的密码是 8 个字符吗?
如果是,则第 8 个之后的所有字符都将被截断。
https://bugs.php.net/bug.php?id=11240
要避免这种行为,请使用 MD5 加密。