2

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

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

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

4

2 回答 2

5

不要使用 md5 作为密码

md5 不是散列密码的适当散列算法,不要使用它。有很多很多参考资料解释了原因 - 包括php 手册

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

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

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

如何更改默认哈希算法

您可以使用setHash更改默认散列算法,推荐的密码散列算法是河豚:

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.

这种逻辑并不复杂,并且可以避免继续使用糟糕的哈希算法。

于 2013-07-04T10:52:28.850 回答
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');
}
?>

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

$newHash = Security::hash($newPassword, 'blowfish', $storedPassword);
于 2013-05-16T10:55:23.663 回答