我不得不将巨大的userdata导入到一个包含md5-hashed密码的新应用程序中。我告诉CakeAUTH使用MD5并使用它,但散列密码与原始散列不匹配。
AuthComponent肯定使用md5(使用xdebug通过登录过程调试)。
在SimplePasswordHasher.php
第52行,其中显示
$this->hash($password)
结果是md5哈希,但不匹配我原来的哈希。
如何解决这个问题?
答案 0 :(得分:0)
事实上,
$this->hash($password);
正在做
Security::hash($string, 'md5', true);
(src:http://api.cakephp.org/2.4/source-class-SimplePasswordHasher.html#41)
所以事实上,你在这里做的不是md5($string)
,你正在做md5($salt.$string)
,它是盐和字符串的串联。
如果您以前的应用程序不使用salt,我认为最简单的方法是将盐设置为空。不推荐,但你也不能反转哈希。
要设置salt,请修改app/Config/core.php
:
Configure::write('Security.salt', '');
不确定是否会收到警告。值得一试。
答案 1 :(得分:0)
这很可能是因为您的应用使用了不同的盐(您的其他应用可能根本没有使用过),请在Config/core.php
中查看Security.salt
。
所以要解决这个问题,你必须要么使用相同的,或者根本不使用盐,但如果你问我,这一点都不是一个好主意。
我建议您强制用户创建新密码,并使用更安全的密码散列算法,如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
仅仅为了记录,a custom password hasher可能是处理外国哈希的最佳方式:
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);
}
}