2011-04-01 54 views
3

現在我正在使用Zend框架並將其與phpunit混爲一談。這是我的困境。使用散列密碼進行單元測試

當我創建一個用戶我哈希在用戶表中的密碼。我添加了兩種鹽,一種是應用程序中的靜態鹽,另一種是隨機生成的。我使用數據庫SHA函數,然後使用UNHEX將密碼存儲在二進制列中。爲了告訴數據庫如何散列密碼我用Zend_Db_Expr像這樣:

protected function _createPasswordDbExpression($password) 
{ 

    $quoted = $this->getDbTable()->getAdapter()->quoteInto('UNHEX(SHA1(?))', $password); 
    $binaryPassword = new Zend_Db_Expr($quoted); 

    return $binaryPassword; 
} 

到現在爲止我已經使用了XML數據集,以指定預期的結果,但現在,隨着散列密碼,我不不知道該怎麼做。

我看到一個解決方案,這一點,但必須有一個更好的辦法。

我可以prehash密碼,或者密碼,只使​​用在我的測試,在我的XML文件。

是否有可能會更好,更可檢驗的任何其他解決方案?

我不知道這個二進制列會究竟是如何影響的事情,當PHPUnit的嘗試直接插入一個「哈希」密碼。

回答

6

首先,從未做到這一點。任何有權訪問數據庫查詢歷史記錄的人都可以看到原始密碼(它們將存儲在二進制日誌中)。相反,將它們散列在應用程序中,以便銷燬原始密碼。通過這樣做,你的數據庫功能就變成了一個價值存儲,而不是需要單元測試的東西。

一旦你做出一個PHP函數,是微不足道的單元測試(只需使用標準test vectors的數量中的任何一個,以確保它是正確的散列。

不過,我會使用高度建議鹽和一個派生函數來安全地存儲密碼,你可以看到爲什麼in this answer。至於確切的算法,我建議實施PBKDF2。我有一個PHP實現,你可以逆向工程,如果你想here(the庫尚未準備好生產,但該算法是)。

最後,我建議使用其中一種SHA2算法而不是SHA1(SHA256或SHA512應該足夠好)。這是更多的碰撞抵抗,並往往被視爲是顯着更強...

+0

感謝您的提示,這已經幫助我使我的代碼方式更可測試。 – 2011-04-06 06:03:26