2012-06-16 59 views
4

據我的理解,在閱讀和研究之後,使用鹽的目的應該是每一個存儲的密碼都是不同的鹽。用Python醃製哈希密碼(每個新密碼都有不同的鹽)

如果使用相同的鹽來存儲所有密碼,我可以理解如何實現這一點,因爲我可以將salt存儲到一個常量私有變量並使用它。但是,情況並非如此。

儘管用新的不同的鹽存儲每個新密碼是完全有意義的,但我怎麼知道哪個用戶的密碼與哪個鹽有關?我想到的快速解決方案是將salt與用戶的表格屬性一起存儲(可能稱爲「鹽」),但如果容易從鹽中找到鹽,那麼它將失去將鹽從第一位置開始的目的數據庫。

任何人都可以就此建議嗎?

注:我使用的是無論是Python的內置庫(hashlib)或Bycrypt(CryptacularPasslib

回答

7

的快速解決方案,我認爲,是對鹽存儲與用戶的表屬性

沿

這正是你所做的。知道鹽並沒有真正減損他們的好處:

  • 數據庫中相同的密碼將具有不同的哈希值。
  • 彩虹表不會工作。
  • 嘗試與任何相匹配的暴力攻擊會放慢速度。
+0

哈啊....這是很酷...哈哈...我看過你的第一篇文章,沒有你們這些最新的3分,我打字更疑惑的問題,直到你用這些最新的3分回答我的疑問。快速響應非常感謝! – MrCooL

0

沒有密碼的目的只是爲了避免簡單的字典攻擊。 TMHO在許多應用程序中只有一個散列用於所有密碼。

例如,讓我們說:神,太陽和愛是常見的密碼。任何攻擊者都可以擁有包含這些單詞的字典,並且有散列。

如果不是存儲散列(密碼),而是存儲散列(密碼+鹽)(或散列(鹽+密碼)),則可以使此字典的攻擊無效,因爲如果您的鹽是'dza $ ^「é) àù'字典包含'dza $ ^「é)àùgod'的概率往往爲0.

在每次輸入中更改鹽值也可能是一種很好的做法(但我認爲不太常見),但您必須找到如何檢索它來檢查密碼。

+1

嗨@Aster,感謝您的分享。 Ermnn ...據我所知,每個新密碼都需要不同的鹽,原因很簡單: 1.同一密碼與同一個鹽具有相同的哈希值,因此黑客/攻擊者很容易破壞多個一旦他們設法破壞其中一個密碼,就會有一個密碼 無論如何,我認爲你的回答會幫助其他人想要了解更多使用鹽教育更多人的好處。爲共享歡呼。 :) – MrCooL

+0

我同意(正如我在文章中提到的,我犯了一個可能讓它不清楚的錯字),但我懷疑這是在許多應用程序中具體完成的事情(據我所知,大多數CMS如Wordpress和Joomla都沒有沒有實現它)。 – AsTeR

1

如果您使用的是cryptacular.bcrypt.BCRYPTPasswordManager,那麼您無需擔心鹽類。它負責生成和存儲散列的鹽。

您可以在下面看到,相同密碼的哈希串是不同的。這意味着鹽已被使用。

對於前:

>>> import cryptacular.bcrypt 
>>> crypt = cryptacular.bcrypt.BCRYPTPasswordManager() 
>>> crypt.encode('aaa') 
'$2a$10$B0czYdLVHJG4x0HnEuVX2eF7T9m1UZKynw.gRCrq8S98z84msdxdi' 
>>> crypt.encode('aaa') 
'$2a$10$Ni7K.pQoal3irbGmREYojOYoi0lye/W0Okz7jqoynRJhW5OCi8Upu'