5

据我阅读和研究后的理解,使用盐的目的应该是为每个要存储的密码使用不同的盐。

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

虽然用新的不同盐存储每个新密码是非常有意义的,但是我怎么知道哪个用户的密码与哪个盐相关联?我想到的快速解决方案是将盐与用户的表属性一起存储,可能称为“盐”,但是如果太容易从中找到盐,那也会失去从一开始就有盐的目的数据库。

任何人都可以对此提出建议吗?

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

4

3 回答 3

7

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

这正是你所做的。知道盐并不会真正减损它们的好处:

  • 数据库中相同的密码将具有不同的哈希值。
  • 彩虹表不起作用。
  • 尝试与您的任何哈希匹配的蛮力攻击将被减慢。
于 2012-06-16T16:54:17.637 回答
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'
于 2013-03-03T21:24:44.830 回答
0

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

例如,假设:上帝、太阳和爱是通用密码。任何攻击者都可以拥有包含这些单词的字典并且有哈希。

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

在每个输入处更改盐也可能是一个好习惯(但我认为不那么常见),但您必须找到如何检索它以检查密码。

于 2012-06-16T16:57:54.910 回答