使用Python的盐渍哈希密码(每个新密码都有不同的盐)

时间:2012-06-16 16:52:57

标签: cryptography hash salt

就我在阅读和研究后的理解而言,使用盐的目的应该是每个存储密码的不同之处。

如果使用相同的盐来存储所有密码,我可以理解如何实现它,因为我可以将salt存储到一个常量私有变量并使用它。但是,事实并非如此。

虽然使用新的不同的盐存储每个新密码是完全合理的,但我怎么想知道哪个用户的密码与哪个盐相关联?我想到的快速解决方案是将盐与用户的表属性一起存储,可能称为“盐”,但是如果从太容易找到盐,那么它将失去从第一个地方获取盐的目的。数据库。

有人可以就此提出建议吗?

注意:我使用的是Python内置库(hashlib)或Bycrypt(CryptacularPasslib

3 个答案:

答案 0 :(得分:7)

  

我想到的快速解决方案是将salt与用户的表属性一起存储

这正是你所做的。了解盐并没有真正减损它们的好处:

  • 数据库中的相同密码将具有不同的哈希值。
  • 彩虹表不起作用。
  • 试图与任何哈希匹配的暴力攻击将会减慢。

答案 1 :(得分:1)

如果您使用的是cryptacular.bcrypt.BCRYPTPasswordManager,那么您无需担心盐分。它负责使用哈希生成和存储salt。

您可以在下面看到,对于相同的密码,哈希字符串是不同的。这意味着使用了盐。

例如:

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

答案 2 :(得分:0)

密码的目的不仅仅是为了避免简单的字典攻击。 TMHO在许多应用程序中只有一个哈希用于所有密码。

例如,让我们说:上帝,太阳和爱是常见的密码。任何攻击者都可以拥有包含这些单词的字典,并且有哈希值。

如果不是存储哈希(密码),而是存储哈希(密码+盐)(或哈希(盐+密码)),你可以使这个字典攻击无效,因为如果你的盐是'dza $ ^“é)àù '字典包含'dza $ ^“é)àùgod'的概率往往为0。

在每次输入时更改盐也可能是一种很好的做法(但我认为不常见)但您必须找到如何检索它以检查密码。