我有一个使用CakePhp 1.3构建的现有网站。在那个网站上,我使用MD5算法进行密码哈希。
现在我想将CakePhp版本升级到2.3.5,但我无法使用MD5作为密码哈希。
我想知道为什么我不能在CakePhp 2.x中使用MD5。 ?
答案 0 :(得分:5)
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);