即使密码后缀后缀,PHP crypt也会返回true

时间:2014-04-11 15:06:06

标签: php hash passwords crypt

所以我的登录脚本漏洞很少。

假设我们有一个用户" David"用密码" s3cret"。如果David使用s3cret登录,他就会登录,一切正常。如果他使用" oijopij"登录,系统将无法按预期授予他访问权限。但是,如果他尝试使用" s3cretHelloimasuffix"登录,他也会登录。这是我用crypt创建哈希的部分:

$salt = //Some random salt string
$hash = crypt( $user->pass, $salt );

然后将此哈希插入到数据库中。

if ( crypt( $this->data->pass, $user->pass ) == $user->pass )
     return true;

return false;

这是实际根据哈希检查密码的部分,密码和哈希都是正确的。但即使有一个后缀beghind密码,它仍然会返回true。

编辑:我忘记了实际问题:我如何解决这个问题?因为它可以被视为安全泄漏,即使在实践中它也不是。

1 个答案:

答案 0 :(得分:4)

crypt因为您正在使用它仅限于8个字符的密码:

php > echo crypt('1234567', 'abc');
ablk9HoaAwzxk
php > echo crypt('12345678', 'abc');
ab1iBa.N.U2C6   
php > echo crypt('123456789', 'abc');
ab1iBa.N.U2C6
php > echo crypt('1234567890', 'abc');
ab1iBa.N.U2C6

请注意... 8,... 89,... 890版本具有相同的哈希值。

crypt已过时,不应再用于密码系统。 password_hash()是现在推荐的方法,它支持多种散列方法,包括bcrypt,它应该用于密码哈希。