2012-12-12 39 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)這樣的任何東西,那麼您將在模型中設置整個記錄的數據 - 包括以前散列的密碼 - 並且您的代碼將盡快哈希它第二次,這顯然不是你想要的。所以是的,在這種情況下你會得到散列偏移。