【问题标题】:CakePHP 2 Hashing Changing Over Time?CakePHP 2 散列随时间变化?
【发布时间】:2013-09-10 05:03:39
【问题描述】:

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

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

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

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

特定用户的密码是'roads'

昨天,哈希是:988042d7f4e62760238d895472ecaf1844094f9f

今天,当我对道路进行哈希处理时,我得到:a8318e7bbe8ee5efc59f53b4ede4d80dc0495c6d

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

我愿意:

  1. 找出哈希值发生变化的原因
  2. 更改 Auth 组件以使用其他数据库登录用户

但我不知道从哪里开始

【问题讨论】:

  • 1.我从未听说过哈希会自行改变。您和其他开发人员是否正在工作并上传 2 diff。 core.php 文件的版本? 2. 让我们看看你用来获取roads 的散列版本的代码。 3. 你用的是什么蛋糕版本?
  • 在 app/Config/core.php 中定义了盐。它说 Configure::write('Security.salt', 'xxxxx...');但它总是一样的。
  • 暂时记录传递给Security::hash的参数,他们可能会说。例如,也许一个函数/动作正在使用不同的哈希算法,甚至是不同的盐。最后,如果您编写一些单元测试,它们可能会揭示发生了什么。

标签: cakephp authentication hash


【解决方案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。

【讨论】:

  • 我无法从他的问题中看出这两个应用程序都是蛋糕depend on another existing application。对我来说,他听起来像是从 api 中提取出来的。 OP,你能澄清一下吗?
  • 第二个应用程序不直接与我的 CakePHP 应用程序交互...我只使用它的数据库进行身份验证。密码是纯文本的,在另一端没有散列......我觉得这很令人不安,但这超出了我当前问题的范围。
  • 如果密码以明文形式存储在哪里进行散列?从数据库中检索到它们之后?
【解决方案2】:

如果您在 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) 之类的东西,您将在模型上设置整个记录数据 - 包括之前的哈希密码 - 和您的代码将尽职尽责地再次对其进行哈希处理,这显然不是您想要的。所以是的,在这种情况下你会得到哈希漂移。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多