2012-12-12 38 views
0

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

  1. 用户首次登录,提供用户名为&的密码。 CakePHP用户记录尚不存在
  2. 系统检查用户名是否存在于另一端
  3. 如果用户确实存在,那么我们提取密码并比较密码以查看是否存在他们匹配。
  4. 如果密码匹配,哈希什么是已经提供和保存用户记录
  5. 登录新创建的用户

这解决了一些问题对我们来说,主要有用户登录多个地方做某些事情。

我的问题似乎是,CakePHP在散列密码时得到的值似乎随着时间而改变。因此,他们不是用用户的密码登录用户,而是在他们登录后的第二天创建新的用户记录。我遇到了一个问题,我昨天无法使用特定用户登录...所以我查看了什么login()操作看到密码的哈希值为。

特定用户的密码是 '道路'

昨天,哈希是:988042d7f4e62760238d895472ecaf1844094f9f

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

我真的不知道在哪里开始寻找,看看为什么会发生。为了让我的开发向前迈进,我所能做的就是更改我想要登录的用户记录的密码的哈希值。这是第二天我会这样做。有什么我可以做的错误的安全哈希或salt值在config/core.php?

我很想之一:

  1. 弄清楚为什么哈希正在改变
  2. 更改验证组件使用其他数据库登录用户

但我不是确定从哪一个开始

+1

1.我从来没有听说过它自己的哈希变化。你和另一个开发人员在工作和上传2个差异吗? core.php文件的版本? 2.让我们看看你用来获取散列版本“道路”的代码。 3.你使用的是什么蛋糕版本? –

+0

在app/Config/core.php中定义了salt。它说Configure :: write('Security.salt','xxxxx ...');但它总是一样的。 – Alvaro

+0

暂时记录传递给[Security :: hash](http://api20.cakephp.org/view_source/security#line-86)的参数,他们可能会说。例如,也许一个函数/动作使用不同的哈希算法或甚至不同的盐。最后,如果你写一些单元测试,他们可能会揭示发生了什么。 – jeremyharris

回答

1

我不知道问题是什么,但我可以告诉你在哪里看。 CakePHP中的AuthComponent使用Security类进行密码散列。

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

这是告诉Security类使用默认算法散列您的密码,并使用Security.salt中配置的salt。如果Security.salt的值在两个应用程序中都不相同,则哈希将不匹配。

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

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

+0

我无法从他的问题中得知这两个应用程序都是“依赖于另一个现有应用程序”的蛋糕。听起来像他从一个API拉。 OP能澄清吗? –

+0

第二个应用程序不直接与我的CakePHP应用程序交互......我只使用它的数据库进行身份验证。密码是纯文本的,而在另一端则是非哈希密码......这让我感到不安,但这超出了我目前问题的范围。 – DirtyBirdNJ

+0

如果密码以明文形式存储在散列正在完成的位置?他们从数据库中检索后? – dmertl

0

如果您在粗糙风格的更新功能中执行某些杂技,可能会发生这种情况。基本上,可能发生的是您要保存密码两次。你可能已经有了你的模型像一些代码:

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)这样的任何东西,那么您将在模型中设置整个记录的数据 - 包括以前散列的密码 - 并且您的代码将尽快哈希它第二次,这显然不是你想要的。所以是的,在这种情况下你会得到散列偏移。