在Cakephp 2.x的Auth组件中使用Md5进行密码哈希

时间:2013-05-16 10:38:12

标签: php cakephp cakephp-2.1

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

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

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

2 个答案:

答案 0 :(得分:5)

不要将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.

这种逻辑并不复杂,并且无需继续使用错误的哈希算法。

答案 1 :(得分:1)

我不建议在任何情况下都使用此代码。 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');
}
?>

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

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