我不得不将大量用户数据导入一个包含 md5 哈希密码的新应用程序。我告诉 CakeAUTH 使用 MD5 并使用它,但散列密码与原始散列不匹配。
AuthComponent 肯定使用 md5(通过登录过程使用 xdebug 进行调试)。
在SimplePasswordHasher.php
第 52 行它说
$this->hash($password)
结果是一个 md5 哈希,但与我的原始哈希不匹配。
如何解决?
实际上,
$this->hash($password);
是在做
Security::hash($string, 'md5', true);
(来源:http: //api.cakephp.org/2.4/source-class-SimplePasswordHasher.html#41)
所以实际上,你在md5($string)
这里做的不是纯,md5($salt.$string)
而是盐和字符串的串联。
如果您之前的应用程序不使用盐,我认为最简单的方法是将您的盐设置为空。不推荐,但您也不能反转散列。
要设置盐,请编辑app/Config/core.php
:
Configure::write('Security.salt', '');
不确定您是否会收到警告。值得一试。
这很可能是因为您的应用程序使用了不同的盐(您的其他应用程序可能根本没有使用),请检查Security.salt
您的Config/core.php
.
所以要解决这个问题,你将不得不使用相同的盐,或者根本不使用盐,尽管如果你问我这些都不是一个好主意。
我建议您强制用户创建新密码,并使用更安全的密码散列算法,如 bcrypt。看
http://book.cakephp.org/2.0/en/core-utility-libraries/security.html#Security::hash
http://book.cakephp.org/2.0/en/core-libraries/components/authentication。 html#using-bcrypt-for-passwords
仅作记录,自定义密码哈希可能是使用外部哈希的最佳方式:
App::uses('AbstractPasswordHasher', 'Controller/Component/Auth');
class BackCompatPasswordHasher extends AbstractPasswordHasher {
public function hash($password) {
return md5($password);
// or using a custom salt if necessary
// return md5('the-other-apps-salt' . $password);
}
public function check($password, $hashedPassword) {
return $hashedPassword === $this->hash($password);
}
}