2012-07-07 281 views
1

因此,當構建一個web應用程序和存儲密碼時,安全和性能是需要牢記的重要事項。看到證據表明,由於GPU的速度越來越快,甚至可以輕易破解SHA1密碼,我想知道存儲密碼的最佳做法是什麼。密碼鹽和祕密

我認爲,爲了增加更多的安全性來存儲密碼,你可以添加一個祕密鹽。因此,舉例來說,這樣做的Python代碼可以是:

import hashlib 
import hmac 

secret = 'XYZ' 
h = hmac.new('salt' + secret, 'password') 
  • 這是做一個平常的事?
  • 這有什麼缺點?
  • 該領域的最佳實踐是什麼?

P.S.我沒有在安全論壇上發佈這篇文章,因爲我想要一個Web應用程序開發人員的視角。

+0

我沒有看到一個很大的區別就在這裏,因爲大不了破解密碼是多麼難以逆轉的散列值。因此,即使你的鹽現在更安全,它可能只是一點點幫助(例如通過消除某些彩虹桌的使用)。會話的隨機祕密通常通過生成隨機比特來獲得,例如使用隨機呼叫。 – dolaameng 2012-07-07 13:53:47

+1

scrypt,bcrypt,PBKDF2 – CodesInChaos 2012-07-07 13:56:06

+0

請注意:[Python * hmac *](http://docs.python.org/library/hmac.html)的默認散列函數是MD5。 HMAC的算法簡單來說就是應用哈希函數兩次。 – Gumbo 2012-07-07 16:26:05

回答

8
+0

如果這是用於應用程序引擎的,建議使用SHA512_crypt,因爲它使用的C代碼比僅用於python的bcrypt/scrypt/pbkdf啓用更多循環。將方法名稱與散列一起存儲,如果其他人在GAE上獲得C實現,則可以切換並向後兼容。 – tesdal 2012-07-07 22:38:22

2

這是在Web應用程序中很常見的事情。如果黑客得到你的數據庫,只要他們不知道鹽以及它放在字符串中的位置,他們可以隨時搜索密碼。所以黑客需要這兩個的代碼和數據庫轉儲才能得到真正的密碼。

我看不到比無鹽的方法的任何缺點,性能,同時安全性明顯增加完全一樣。

更重要的是,鹽應該是你編碼每個密碼不同,你必須選擇一個鹽是足夠長的時間(時間越長越好)。

例如,黑客需要每個鹽的密碼錶,這意味着許多計算。即使你存儲在數據庫中的鹽,這是一個痛苦的黑客破解非標準鹽(標準鹽可以根據用戶名鹽:管理 ...)

你也可以請參閱this answer瞭解更多詳情和解釋。

然而,像BCrypt庫是非常好的密碼學,他們往往是由著名黑客測試,因此我不認爲你可以信任他們。

3

標準是不使用相同的鹽一遍又一遍。例如,使用用戶名作爲鹽。或者生成一個隨機鹽並將其添加到結果中。

添加一個「祕密」並不會真的改變任何東西。這只是一個更長的,但仍然是固定的,鹽,你必須分發到檢查密碼的服務器,所以它真的不是那個祕密,是嗎?

4

你要做的僅僅是你的鹽的時間長一點......也就是說,你現在鹽是saltXYZ而不是隻salt

從我的角度來看,這和使用普通鹽沒什麼兩樣,所以這讓你的前兩個問題沒有意義。

就最佳實踐而言,最重要的是「永遠不要推出自己的密碼」。不要幻想,用一個知名的圖書館來處理這些事情。這些天很受歡迎。它可能有一個漏洞,但如果它有,它可能會被發現,因爲有訓練的加密分析師每天都在攻擊它。

+1

+1永遠不會推出自己的。 – Antimony 2012-07-08 14:56:47

1

添加一個祕密不會傷害,它有助於在某些情況下。所以我建議使用一個作爲防禦深度措施。
但是在主要場景中密碼散列的目的是,它並沒有幫助:您的服務器被攻破,攻擊者獲悉這個祕密。

爲了抵禦密碼猜測攻擊,您應該使用故意緩慢的哈希函數,即scrypt,bcrypt和PBKDF2之一。

  1. 你不使用鹽:

    你的代碼中有兩個重要的弱點。每個用戶的鹽應該不同。標準做法是64位或更多位的隨機數。

  2. 單次迭代hmac速度很快,所以使用我提到的慢速方案之一。
+0

在這種情況下,HMAC鍵功能與鹽是否非常相似? – cha0site 2012-07-07 14:05:34

+0

@ cha0site他正在使用一個常量。每個用戶的鹽應該不同。 – CodesInChaos 2012-07-07 15:11:38

+0

他也有一個不變的密碼,我認爲這是一個例子=) – cha0site 2012-07-07 16:32:25