就我在阅读和研究后的理解而言,使用盐的目的应该是每个存储密码的不同之处。
如果使用相同的盐来存储所有密码,我可以理解如何实现它,因为我可以将salt存储到一个常量私有变量并使用它。但是,事实并非如此。
虽然使用新的不同的盐存储每个新密码是完全合理的,但我怎么想知道哪个用户的密码与哪个盐相关联?我想到的快速解决方案是将盐与用户的表属性一起存储,可能称为“盐”,但是如果从太容易找到盐,那么它将失去从第一个地方获取盐的目的。数据库。
有人可以就此提出建议吗?
注意:我使用的是Python内置库(hashlib)或Bycrypt(Cryptacular或Passlib)
答案 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。
在每次输入时更改盐也可能是一种很好的做法(但我认为不常见)但您必须找到如何检索它以检查密码。