【问题标题】:Using Md5 for password hash in Auth component of Cakephp 2.x在 Cakephp 2.x 的 Auth 组件中使用 Md5 进行密码哈希
【发布时间】:2013-05-16 10:38:12
【问题描述】:

我有一个使用 CakePhp 1.3 构建的现有网站。在那个网站上,我使用了 MD5 算法作为密码哈希。

现在我想将我的 CakePhp 版本升级到 2.3.5,但我无法使用 MD5 作为密码哈希。

我想知道为什么我不能在 CakePhp 2.x 中使用 MD5。 ?

【问题讨论】:

  • 你现在想要什么?问题在哪里?不能投反对票.... -1
  • 为什么要使用MD5 来对已知为unsuitable for the task 的密码进行哈希处理?
  • 您绝对应该使用Fallback 散列器将所有 PWD 缓慢迁移到更现代的散列算法。这可以在用户不注意的情况下完成,并且在某些时候,当所有迁移完成后,您可以完全禁用 md5。

标签: php cakephp cakephp-2.1


【解决方案1】:

不要使用 md5 作为密码

md5 不是散列密码的合适散列算法,不要使用它。有很多很多参考资料可以解释原因 - 包括 the php manual:

为什么 md5() 和 sha1() 等常见的散列函数不适用于密码?

MD5、SHA1 和 SHA256 等哈希算法被设计为非常快速和高效。借助现代技术和计算机设备,“蛮力”这些算法的输出以确定原始输入已变得微不足道。

由于现代计算机可以“逆转”这些散列算法的速度有多快,许多安全专家强烈建议不要将其用于密码散列。

如何更改默认哈希算法

您可以使用setHash 更改默认哈希算法,recommended hash algorithm for passwords 是河豚:

Security::setHash('blowfish');

如何处理现有密码

如果你真的想,你可以把setHash改成使用md5。

但这不是一个好主意。

不要为了适应旧应用程序的低安全性而损害新/更新应用程序的安全性。您可以使用如下逻辑(伪代码),而不是使用与前一个应用程序相同的哈希算法(和盐):

$username = $this->data['User']['username'];
$plainText = $this->data['User']['password'];

$user = current($this->User->findByUsername($username));

Security::setHash('blowfish');
$blowfished = Security::hash($plainText, 'blowfish', $user['password']);

if ($blowfished === $user['password']) {
    return true; // user exists, password is correct
}

$oldSalt = Configure::read('configure.this');
$md5ed = Security::hash($plainText, 'md5', $oldSalt);

if ($md5ed === $user['password']) {
    $this->User->id = $user['id'];

    $blowfished = Security::hash($plainText);
    $this->User->saveField('password', $blowfished);

    return true; // user exists, password now updated to blowfish
}

return false; // user's password does not exist.

这种逻辑并不复杂,避免了继续使用糟糕的哈希算法的需要。

【讨论】:

    【解决方案2】:

    我永远不建议在任何情况下使用此代码。 MD5 是一种可怕的安全性哈希算法,因为它资源太少,无法阻止破解。它也有已知的漏洞。使用 bcrypt 或 SHA-512。

    为此,您可以像这样编辑AppController.php

    <?php
    // AppController.php
    
    public function beforeFilter()
    {
        Security::setHash('md5');
    }
    ?>
    

    但是,不建议这样做,因为 MD5 是一种非常糟糕的密码散列算法。你最好添加一个功能,允许用户使用现有的md5 密码登录,鼓励他们升级到新的哈希,并且不允许任何新用户设置 MD5 密码。

    如果您想使用像 bcrypt 这样的安全函数,您可以执行以下操作:

    <?php
    // AppController.php
    
    public function beforeFilter()
    {
        Security::setHash('blowfish');
    }
    ?>
    

    在将明文值与哈希值进行比较时,您必须将原始哈希值作为盐值传递以保留成本参数等:

    $newHash = Security::hash($newPassword, 'blowfish', $storedPassword);
    

    【讨论】:

    • 如果我不告诉他如何使用 MD5,我就不会回答这个问题——这是 StackOverflow 而不是 CodeReview。如果我告诉他如何使用 MD5,我必须解释为什么他不应该这样做。
    • @AD7six 在实际场景中,您经常不得不做一些不好的做法,尤其是在客户要求时。您最多只能提出替代方案;你付钱是为了实施解决方案,而不是评判它。对于大多数客户来说,100 美元的“保持 MD5 散列”优于 500 美元的“将所有内容切换到 bcrypt 散列,实施一个系统来更改所有 md5 用户密码并通过电子邮件发送给他们”。在回答时,您不能假设 OP 可以 100% 控制实施细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2015-11-30
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多