2008-08-03 152 views
27

什麼是最快,但安全的方式來加密密碼(首選PHP),並且你選擇哪種方法是可移植的?加密密碼

換句話說,如果我以後將我的網站遷移到不同的服務器,我的密碼會繼續工作嗎?

我正在使用的方法正如我所知,取決於安裝在服務器上的庫的確切版本。

回答

29

如果您爲您的登錄系統選擇加密方式,那麼速度不是您的朋友,傑夫與托馬斯Ptacek關於密碼的方式是一致的,conclusion是您應該使用最慢,最安全的加密方法你可以負擔得起。

從托馬斯Ptacek的博客:
速度正是你不希望在一個密碼散列函數是什麼。

現代密碼方案受增量密碼破解程序的攻擊。

增量餅乾不會預先計算所有可能的破解密碼。他們分別考慮每個密碼散列,並且他們通過密碼散列函數以與PHP登錄頁面相同的方式提供他們的字典。 Ophcrack等彩虹桌面餅乾使用空間攻擊密碼;像John the Ripper,Crack和LC5這樣的增量破解者可以和時間一起工作:統計和計算。

密碼攻擊遊戲在破解密碼X所花費的時間內得分。對於彩虹表,這個時間取決於你的表需要多大以及你能夠多快搜索它。使用增量破解程序時,時間取決於您可以使密碼哈希函數運行的速度。

你可以更好地優化你的密碼哈希函數,你的密碼哈希函數得到的速度越快,你的方案就越弱。 MD5和SHA1,即使是傳統的分組密碼,如DES,也被設計得很快。 MD5,SHA1和DES是弱密碼散列。在現代CPU上,像DES和MD5這樣的原始密碼構建模塊可以進行比特,矢量化和並行化,從而快速地進行密碼搜索。遊戲式FPGA實現僅需花費數百美元。

14

我和彼得在一起。開發人員似乎並不瞭解密碼。我們都選擇(我也有這個)MD5或SHA1,因爲它們速度很快。思考它(最近有人指出了這一點),這沒有任何意義。我們應該選擇一個愚蠢緩慢的哈希算法。我的意思是,在事物的規模上,一個繁忙的網站會亂碼密碼是什麼?每1/2分鐘?誰在乎是否需要0.8秒vs 0.03秒的服務器?但是這種額外的緩慢是巨大的,以防止所有類型的常見的暴力破壞攻擊。

從我的閱讀中,bcrypt是專門爲安全密碼散列而設計的。它基於河豚,並且有很多實現。

對於PHP,檢查出PHPPass http://www.openwall.com/phpass/

對於任何人這樣做.NET,檢查出BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

2

我不一定要找最快的,但一個很好的平衡,一些服務器的那此代碼正在開發中,速度相當慢,散列並存儲密碼的腳本需要5-6秒才能運行,並且我已將其縮小到哈希值(如果我評論哈希運算, 2秒)。

它並不一定是最安全的,我不是爲一家銀行在作弄我(現在),但我肯定不會店密碼爲純文本。

+0

雖然這是封閉的,你仍然應該儘可能安全地存儲密碼。什麼是獲取someeones銀行帳戶密碼的最簡單方法?創建一個令人敬畏的網站,讓你的人註冊。大多數人會使用現有的密碼。現在你有一個巨大的密碼列表。要說的是,如果我知道這是一個糟糕的實現,那麼獲取其他人密碼的最快捷方式就是破解你的系統。 – 2010-12-29 16:04:31

8

應該指出,你不想加密的密碼,你想散列它。

加密密碼可以解密,讓別人看到密碼。哈希是一種單向操作,因此用戶的原始密碼(加密)消失了。


至於哪種算法,你應該選擇 - 用目前公認的標準之一:

  • SHA-256

當你哈希用戶的密碼,請務必同時哈希在一些其他垃圾與它。例如:

  • 密碼:password1
  • 鹽:PasswordSaltDesignedForThisQuestion

追加鹽用戶的密碼:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
+4

-1 SHA-256不是密碼散列函數,因此不適合此用途。它可以是*(PBKDF2)的一部分,但完全不同。你的例子也是誤導性的,因爲鹽不應該是一個聰明的詞組,它應該是一個隨機的(每用戶)價值。 – 2012-09-20 20:42:20

7

不管你做什麼,不寫自己的加密算法。這樣做幾乎可以保證(除非你是一個密碼專家),算法中會存在一個缺陷,使得破解微不足道。

+0

即使你是一個密碼學家,它可能會有一個缺陷 - 在算法變得「流行」之前需要多年的審查。 – 2008-09-19 16:03:35

2

考慮使用bcrypt它用於許多現代框架,如laravel。