密码盐:前置和附加

And*_*Dog 10 security hash salt password-protection

我只是看着密码哈希的在Django的实施,发现它预先将盐,所以散列创建类似sha1(salt + password),例如.

在我看来,盐有两个目的

  1. 防止彩虹表查找

    好吧,预先添加/添加盐对彩虹表并没有什么影响.

  2. 强化蛮力/字典攻击

    这就是我的问题所在.如果有人想从被盗的密码数据库中攻击单个密码,他需要尝试大量密码(例如字典单词或[A-Za-z0-9]排列).

    假设我的密码是"ABCDEF",该盐是"盐",而攻击者尝试所有[AZ] {6}密码.

    使用前置盐,必须计算hash("salt"),存储哈希算法的状态,然后从该点继续进行每个排列.也就是说,遍历所有排列将需要26 ^ 6个复制哈希算法的状态结构操作和26 ^ 6个hash(permutation of [a-z]{6})操作.由于复制哈希算法的状态非常快,所以无论多长时间,盐都不会增加任何复杂性.

    但是,使用附加的盐,攻击者必须计算hash(permutation of [a-z]{6} + salt)每个排列,导致26 ^ 10个哈希操作.显然,添加盐会增加复杂程度,具体取决于盐的长度.

我不相信这是出于历史原因,因为Django相当新颖.那么预先添加盐有什么意义呢?

Cod*_*aos 10

不要这样做,使用像PBKDF2这样的标准Key派生函数.永远不要滚动你自己的加密.弄错了太容易了.PBKDF2使用多次迭代来防止暴力,这比简单的排序要大得多.

并且在处理salt之后预先计算散列函数的内部状态的技巧可能并不容易实现,除非salt的长度对应于底层块-cypher的块长度.