@
ryan4yin 我认为你说的有道理。这种场景这么做是有意义的。送一个感谢。
摸个大鱼,写个长文。
很多人都在说:
”多次迭代 hash 很多人都在说第二次输入范围变小“。我就不一一 at 了。
@
YGHMXFAL 关于多次迭代的问题我先说,多算法嵌套的问题我下文说。
我们来做一个脑内实验:
如果我们用同一个 hash 算法,进行几乎[无穷]多次迭代,那么一定会在某一次碰撞,对吧?毕竟 hash 值域空间有限。
而且,根据鸽巢原理,随着迭代次数增加,和之前迭代过程中 hash 碰撞概率也随之增加。比如迭代了 1 亿次,
这个碰撞来临的可能比我们预想的快(生日悖论)。
我们这样写:a 经过 hash 成为 b ,b 再 hash 成 c ,我们在这里写成 a->b->c
a->b->c->d->e->f->g
到此为止,一切都好。但是在下一时刻,g 经过 hash 后发生了碰撞成了[e]
于是最后这个 hash 就成了
a->b->c->d-> e->f->g-> e->f->g-> e->f->g-> e->f->g......
你会发现这个 hash 碰撞后会不可避免地陷入了一个循环。
最后结果就在 efg 这三个结果之间,实际上的值域变小。此后再多迭代次数也没有意义。我只要知道这个环里的元素 efg ,知道迭代次数,我们就可以推算出具体哪个元素可以构成碰撞。
比如上面就是 hash(a)*8=f, 我们不知道 a, 但是我们可以 8mod3=2 ,hash(g)*8=f=hash(a)*8 这样构造出碰撞。
然而对于一个健壮的 hash 算法来说出现上述情况很难,或者说你只迭代一千次一万次完全没问题。甚至就算有碰撞,这个环也可能大到难以探测。
再说组合不同算法:
假设一个不安全 hash 叫做 weak, 只输出 1 位。不是 0 就是 1.碰撞概率五五开。
你 sha-512 然后 weak ,会怎么样?碰撞概率依旧五五开。组合 hash 算法安全性取决于最差的那个 hash 。调换顺序也没用。
@
gbadge 不可以替代 salt 。多次迭代会增加算力消耗没错。salt 让彩虹表无法复用,而且在空间和计算上都制造难度。
@
jim9606 长度扩展攻击...可能不会让破解变得容易。至少我不知道。因为长度扩展攻击可以在我只知道 MD5(pwd)和 salt 的情况下算出 MD5(pwd+salt)但是我的确不知道怎么算 pwd 或者 MD5(pwd)...不管怎样,反正 MD5 ,SHA-1 的确就别再用了。
其他人懒得一个个回复了。
最后好好回复给 OP:
理论上:OP 的做法意义不大。虽然应该不会更不”随机“,但是安全性取决于最差的那个算法。而且只要有一个算法有问题那整个都变弱。迭代是有意义的,代价就是可以忽略的碰撞概率增加。
实际上:OP 的做法很有意义。黑客喜欢用现成的服务比如 hash 查询。黑客看到你这种骚操作很可能骂娘后直接放弃。但是弱密码依旧有可能被破解。
把黑客恶心死,也是一种安全。
多次迭代拖慢暴力,奇葩嵌套无法查询,加盐对抗彩虹表,密码策略防止弱密码对抗字典。
(所以...为什么不用 bcrypt 这些呢?)