【问题标题】:Cakephp 2 - Password hashCakephp 2 - 密码哈希
【发布时间】:2013-09-25 07:51:43
【问题描述】:

我必须将大量用户数据导入一个包含 md5 哈希密码的新应用程序。我告诉 CakeAUTH 使用 MD5 并且它正在使用它,但哈希密码与原始哈希不匹配。

AuthComponent 肯定使用 md5(通过登录过程使用 xdebug 调试)。

SimplePasswordHasher.php 第 52 行,上面写着

$this->hash($password)

结果是一个 md5 哈希,但与我的原始哈希不匹配。

如何解决?

【问题讨论】:

    标签: cakephp md5


    【解决方案1】:

    其实

    $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),它是盐和字符串的连接。

    如果您之前的应用程序不使用盐,我认为最简单的方法是将您的盐设置为空。不推荐,但您也不能反转哈希。

    要设置盐,编辑app/Config/core.php:

    Configure::write('Security.salt', '');
    

    不确定您是否会收到警告。值得一试。

    【讨论】:

      【解决方案2】:

      这很可能是因为您的应用使用了不同的盐(您的其他应用可能根本没有使用),请在您的 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);
          }
      
      }
      

      【讨论】:

      • @gonzela2006 在app/Controller/Component/Auth/BackCompatPasswordHasher.php,请查看链接文档。