2012-10-19 17 views
0

我在一個項目上工作&我熱衷於保持密碼存儲安全的一開始。在想法階段,但這大概是我打算使用的。在PHP中使用多哈希

class Crypto { 
    public function hash1($string, $salt) { 
     return hash('sha512', $string . $salt); 
    } 

    public function hash2($string, $salt) { 
     return hash('sha512', $salt . $string); 
    } 

    public function compareToHash($string, $salt, $hash1, $hash2) { 
     return($this->hash1($string, $salt) === $hash1 && $this->hash2($string, $salt) === $hash2); 
    } 
} 

正如你所看到的,我試圖避免碰撞。這是一種有效的方式,它看起來非常簡單,我不知道我是否錯過了一些東西。

謝謝。

+1

「避免碰撞」是什麼意思? – Baba

+0

在兩個單獨的字符串中返回相同的散列 – CDCM

+0

SHA521中'碰撞'的可能性是'2^256'你認爲你可以在你的密碼哈希中擊敗? – Baba

回答

0

既然你打算密碼保護可能是一個網站,讓我解釋一下,你將需要確保從已編碼的客戶端或其他任何嗅探器發送密碼會發現真正的密碼,你知道如何人們通常使用密碼,對吧?許多帳戶也一樣。

我建議考慮看看後,前一段時間我在stubled,並保留一個鏈接它,因爲它解釋了所有與哈希和密碼保護問題:http://www.codinghorror.com/blog/2007/09/rainbow-hash-cracking.html

不久 - 使用最強(而sha1不再強大)密碼編碼器,因爲它是可能的。不是最快的。讓黑客放鬆嘗試入侵的寶貴時間。太多了,那麼入侵將變得沒有吸引力。

希望它會有所幫助,祝你好運。

0

這是非常基本的。我想看看OWASP的Password Storage Cheat Sheet。也有很多密碼哈希庫已經創建和審查。

我想看看在Portable PHP Hashing Framework通過OpenWall的。它創建非常安全的散列,並執行適當次數的迭代。它也被廣泛使用。

如果您使用SHA512進行哈希處理,那麼您在避免碰撞時就沒有什麼特別的要求,我記得最近發現發現碰撞在一段時間內仍然不可行。

兩個主要的事情,我將集中在是安全的鹽(20+字節)和迭代散列至少64000次,以增加攻擊的時間。

0

密碼安全的第一條規則:如果,如果事情是安全的不確定,那麼賠率是它不是。

由於您剛開始編寫密碼例程,我的建議是現在就停下來。

PHP5.5(由於從二月/ MAR 2013年)將拿出一套專門用於處理與心目中的最佳實踐安全口令設計的新功能。當5.5發佈時,這些函數將成爲PHP中唯一推薦的處理密碼的方法。

的好消息是,你不必等待或升級到5.5,才能使用這些功能 - 他們已經回到移植到了5.3和5.4上運行,所以你現在就可以使用它們。從這裏下載庫:https://github.com/ircmaxell/password_compat

參考文章:http://www.h-online.com/open/news/item/PHP-5-5-should-reduce-password-sloppiness-1707835.html

+0

這是一個很好的經驗法則。這不是它的範圍,只是一個簡單的輪廓。 – CDCM

+0

我真正想要的是,我是不是以某種方式錯誤地認爲安全性通過比較密碼和兩個哈希來大規模增加,而不僅僅是一個。 – CDCM

+0

我不知道該給出一個自信的答案。這聽起來應該是合乎邏輯的,但加密中有很多東西與直覺相反,特別是圍繞這樣的問題。你可能想在http://security.stackexchange.com/上提出這個問題 - 那裏有更多的專家會給你一個確切的答案,而不是他們最好的猜測。就我而言,我仍然建議查看我鏈接到的PHP標準密碼API;它的目標是消除對這些問題的需求,並提供默認安全性。 – Spudley

0

如果你想使你的密碼存儲從一開始就安全,你不應該使用sha512或任何其他快速哈希算法,而不是使用密鑰推導功能 like BCrypt

快速算法的問題是,您可以使用通用硬件(in 2012)計算每秒80兆sha512散列值。這使得用幾百毫秒的時間就可以用一個大約500,000個單詞強制整個英文字典!其他算法甚至更快。

BCrypt是專門設計用於哈希密碼,因此(需要一些計算時間)。利用成本因素,您可以將所需的時間適應未來(因此速度更快)的硬件。

使用BCrypt可以像使用sha512哈希一樣簡單。建議使用像phpass這樣一個完善的庫,如果你想了解它是如何實現的,你可以閱讀這個article,我試圖解釋最重要的一點。

您的計劃與兩個單獨的哈希不會增加安全性,因爲與sha512的衝突從來都不是問題。在最壞的情況下,它甚至會削弱安全性,因爲你必須存儲兩個哈希值,所以攻擊者有兩個有關哈希密碼的相關信息。