至于阅读和研究后,我的理解,使用盐的目的应该是不同的盐用于存储每一个密码。
如果相同的盐用于存储所有的密码,我可以理解如何实现这一点,因为我可以在盐只存储一个恒定的私有变量和使用它。 但是,事实并非如此。
虽然它使存储与新的不同的盐,每一个新的密码非常合情合理的,但我怎么想知道哪个用户的密码关联到盐? 快速解决方案,我认为,是一起存储盐与用户的表属性,也许称为“盐”,但将失去从第一位置太具有盐,如果它太容易从发现盐的目的数据库。
可以在这个人的意见?
注:我使用Python的任建库( hashlib )或Bycrypt( Cryptacular或Passlib )
快速解决方案,我认为,是一起存储盐与用户的表属性
这正是你做了什么。 知道了盐并没有真正从他们的利益减损:
- 在你的数据库相同的密码会有不同的哈希值。
- 彩虹表将无法工作。
- 试图来匹配您的任何哈希的蛮力攻击将减慢。
如果你正在使用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'
无密码的目的只是为了避免简单化的字典攻击。 TMHO在许多应用程序有用于所有的密码只有一个哈希值。
例如,让我们说:神,阳光和爱是常见的密码。 可以有任何攻击者包含这些词词典,有散。
如果不是存储哈希(密码),您存储哈希(密码+盐)(或哈希(盐+密码))可以让这个字典攻击无效的,因为如果你的盐是'DZA $ ^“)与非盟的概率该字典包含 'DZA $ ^“é)àùgod' 趋于0。
在每个输入更改盐可能是也是一个很好的做法(但我觉得不那么常见),但你必须找到如何找回它来检查密码。