0

我正在制作一个需要依赖另一个现有应用程序来获取其登录信息的 CakePHP 2.2.3 应用程序。用户名/密码组合存在于另一个数据库/服务器上,我已经设置了我的 CakePHP 应用程序以在他们第一次登录我的界面时创建新用户。这是过程:

  1. 用户首次登录,提供用户名和密码。CakePHP 用户记录还不存在
  2. 系统检查另一端是否存在具有相同(已清理)用户名的用户
  3. 如果用户确实存在,那么我们获取密码并比较密码以查看它们是否匹配。
  4. 如果密码匹配,则对提供的内容进行哈希处理并保存用户记录
  5. 登录新创建的用户

这为我们解决了一些问题,主要是有多个地方供用户登录以执行某些操作。

我的问题似乎是 CakePHP 在对密码进行哈希处理时获得的值似乎会随着时间而改变。因此,它不是使用密码登录用户,而是在他们登录的每一天创建一个新的用户记录。我遇到了一个问题,昨天我无法使用特定用户登录......所以我检查了login() 操作被视为密码的哈希值。

特定用户的密码是“roads”

昨天,哈希是:988042d7f4e62760238d895472ecaf1844094f9f

今天,当我哈希道路时,我得到:a8318e7bbe8ee5efc59f53b4ede4d80dc0495c6d

我真的不知道从哪里开始寻找为什么会发生这种情况。为了使我的开发向前发展,我所能做的就是更改我要登录的用户记录的密码的哈希值。这是我做这个的第二天。config/core.php 中的安全哈希或盐值有什么我可能做错的吗?

我愿意:

  1. 弄清楚为什么哈希会发生变化
  2. 更改 Auth 组件以使用其他数据库登录用户

但我不确定从哪里开始

4

2 回答 2

1

我不能告诉你问题是什么,但我可以告诉你去哪里找。CakePHP 中的 AuthComponent 使用 Security 类来进行密码散列。

public static function password($password) {
    return Security::hash($password, null, true);
}

这告诉 Security 类使用默认算法对您的密码进行哈希处理,并使用在 Security.salt 中配置的 salt。如果 Security.salt 的值在任一应用程序中不同,则哈希将不匹配。

第二种可能性是,在创建用户记录时,您没有使用与 AuthComponent 相同的 Security::hash 设置。检查您没有指定不同的算法或提供盐。

第三种可能性是一个应用程序缺少散列算法。例如,如果 sha1 在您的登录应用程序上可用,但在您的数据库应用程序上不可用,则哈希将不匹配。数据库应用程序将回退到 sha256,登录应用程序将使用 sha1。

于 2012-12-12T23:47:07.253 回答
0

如果您在 crud 样式的更新功能中执行某些杂技,则可能会发生这种情况。基本上,可能发生的情况是您将密码保存了两次。您的模型中可能有一些代码,例如:

public function beforeSave($options = array()) {
    if(isset($this->data[$this->alias]['password'])) {
    $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
    }
return true;
}

作为安全预防措施,这保证了附加到模型的任何密码数据在发送到数据库之前都会经过哈希处理。但是,如果您在更新函数中调用 $this->MyModel->read(null, $someId) 之类的东西,您将在模型上设置整个记录数据 - 包括之前的哈希密码 - 和您的代码将尽职尽责地再次对其进行哈希处理,这显然不是您想要的。所以是的,在这种情况下,你会得到哈希漂移。

于 2013-09-09T21:03:39.257 回答