注意:在进行此编辑后,我正在查看此问题,并将其考虑在内:
注意:我特别指的是链接文档中描述的多轮密码散列,并在密码散列中标有代码 $5$ 和 $6$,而不是单轮普通的 SHA256 或 SHA512 散列函数。
查看您提供的此链接中的长 22 步算法,我宁愿提出一个问题:为什么您更愿意使用这个而不是PBKDF2和 HMAC-SHA2?因为,至少如前所述:
- PBKDF2 的定义看起来要简单得多。 这是因为它更加模块化——它将大部分工作交给外部提供的伪随机函数。这通常使用HMAC实例化,而 HMAC又将其大部分工作交给外部散列函数,如 SHA-1 或 SHA-2。
- 这意味着 PBKDF2 的安全性应该更容易分析。
相比之下,您提供的文档中的算法列出了大量步骤,其动机更难理解。例如:
11. For each bit of the binary representation of the length of the
password string up to and including the highest 1-digit, starting
from to lowest bit position (numeric value 1):
a) for a 1-digit add digest B to digest A
b) for a 0-digit add the password string
NB: this step differs significantly from the MD5 algorithm. It
adds more randomness.
它增加了更多的随机性?它是如何做到的?为什么会存在这一步——SHA-2 是否没有增加足够的随机性?如果 SHA-2 不够随机,为什么要首先使用它?并且这一步不是在算法中引入了依赖于秘密的分支,从而引发了可能针对它的定时攻击的问题吗?
我绝不是说您链接的算法不安全。就是这样:
- 他们引入的工作因素归结为与 PBDKF2--HMAC-SHA2 所做的相同的事情(大量的 SHA2 迭代);
- 如果您展开 PBKDF2-HMAC-SHA2 实现,它们看起来与您所拥有的非常相似,但具有额外的复杂性,我不明白其目的;
- 因此,至少正如那些文档中所述,我发现对他们的设计获得信心比对 PBKDF2 更难。
编辑:在我写完所有这些之后,我对这个算法做了一些研究,试图更好地理解它。首先,从问题本身的“描述”和“规范”链接中,我们了解到该算法是通过进行相对较小的修改而从较旧的基于 MD5 的算法派生而来的。
这种较旧的基于 MD5 的算法似乎是 Poul-Henning Kamp 在 1994 年为 FreeBSD-2.0 编写的算法,他不再认为它是安全的。在第一个链接中(他讲述了函数的历史),他提到 glibc 也采用了他的函数。他还链接到Provos 和 Mazières 1999 年关于 bcrypt 的论文,并提到它表达了一些反对意见,有趣的是,他们强调了上面引起我注意的同一步骤:
MD5 crypt以多种不同的组合对密码和盐进行哈希处理,以减慢评估速度。算法中的某些步骤让人怀疑该方案是从密码学的角度设计的——例如,密码长度的二进制表示在某个点决定了哪些数据被散列,对于每个零位,密码的第一个字节和对于每个设置位,前一个哈希计算的第一个字节。
但我认为这解释了您所询问的新功能的动机:它们是对旧功能的最小修改,该功能早于大多数现代密码哈希函数,其设计已受到质疑,但可能并未从根本上破坏,只是毫无意义的复杂。