使用盐多次散列密码以增加每次蛮力迭代所需的时间是公认的智慧。同时(除非算法另有保证)以固定点或循环结束的可能性很小但非零,因此(例如)
hash(hash(hash_so_far + salt) + salt) = hash(hash_so_far + salt)
或者
hash(hash(hash(hash_so_far + salt) + salt) + salt) = hash(hash_so_far + salt)
等等。
这样的身份或短*周期将是安全黑洞——更多的迭代并不意味着更难破解——而这样的周期很常见的算法将比无用更糟糕,导致几个明显的问题:
- MD* 和 SHA-* 等常见算法的平均和中值循环长度是否已知?
- 是否有有用的*算法可以保证最小的循环是整个输出空间?
* AFAICT,当输出空间用完时,任何有用的散列算法(有限输出,确定性)都会有至少一个“平凡”的循环。