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

标签 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;

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

编辑:我忘记了实际的问题:如何解决这个问题?因为它可能被视为安全漏洞,尽管实际上并非如此。

最佳答案

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,它应该用于密码哈希。

关于即使密码后面有后缀,PHP crypt也会返回true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23016244/

相关文章:

ios - 在密码下隐藏 iPad 应用程序

php - 在 Wordpress 主题中包含 PHP 文件的正确方法

php - 连接到同一网络上另一台电脑上的 mysql 数据库

ruby - .each_with_object ruby 解释?

hash - 过滤 Redis 哈希条目

ruby - 帮助重构 Ruby 哈希切片和切 block

MySQL - 使用存储过程设置用户密码

svn - 更新 Subversion 服务器配置文件不起作用

javascript - 更改 Google 图表中的表标题背景颜色

php - 类是否只能对其命名空间可见