拉伸哈希,多次迭代与更长的输入字符串

信息安全 密码学 密码 哈希
2021-08-23 04:30:09

我一直在阅读各种密码散列方案,例如Ulrich Drepper 提出并在某些 Linux 版本中使用的基于 SHA 的 Crypt。

这里反复出现的主题是通过使用相同哈希的多次迭代来“加强”或“拉伸”哈希函数。散列函数的运行时间也可以通过将saltandpassword连接数千次来增加,形成一个更长的字符串,然后对字符串进行一次散列。但是,这种方法似乎并不受欢迎。

为什么会这样——为什么将saltandpassword多次连接在一起并不是扩展散列函数的可行方法?

2个回答

没有使用多次连接盐和密码的主要原因是传统和懒惰的结合。也就是说,由于密码大小不是固定的,因此必须调整副本的数量,以使“更长的字符串”大小达到给定的目标。似乎这种方案的一些初始实现者发现它很麻烦,可能是因为它意味着使用“流式”哈希函数实现(通过连续块接受数据)而不是单函数调用实现。大多数不可告人的设计师只是出于没有真正好的(也不是坏的)原因而复制了以前的设计。

从理论上讲,salt 和密码的多个串联更好,因为多次迭代减少了可能的散列值的空间(散列函数不是排列)。但减少量不会低于256 位散列函数的 2 128个空间,所以这里不用担心。

出于密码存储目的“拉伸”(迭代)散列函数的原因不是为了产生更强的散列,而只是为了减慢函数的速度,目的是减缓离线暴力破解和基于字典的攻击。

迭代只是实现这一目标的一种简单方法,因为结果很容易计算出来(1000 次迭代大约是一次迭代的 1000 倍)。连接会产生类似的效果,但更难确定输入字符串需要多长时间才能获得类似的减速。