我有一个使用 CakePhp 1.3 构建的现有网站。在那个网站上,我使用 MD5 算法作为密码哈希。
现在我想将我的 CakePhp 版本升级到 2.3.5,但我无法使用 MD5 作为密码哈希。
我想知道为什么我不能在 CakePhp 2.x 中使用 MD5。?
我有一个使用 CakePhp 1.3 构建的现有网站。在那个网站上,我使用 MD5 算法作为密码哈希。
现在我想将我的 CakePhp 版本升级到 2.3.5,但我无法使用 MD5 作为密码哈希。
我想知道为什么我不能在 CakePhp 2.x 中使用 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.
这种逻辑并不复杂,并且可以避免继续使用糟糕的哈希算法。
我不建议在任何情况下都使用此代码。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);