我知道使用众所周知且经过良好测试的哈希算法而不是自己设计是很重要的。为此,通常有可用的参考实现,它们使用手动选择的随机数初始化所需的常量。
当我使用这样的实现时,选择自定义常量是否会提高安全性?我希望攻击者在暴力破解我的哈希时使用最有可能的值,这些值来自参考。
一个强大的加密散列算法不应该是可破解的,即使在使用加盐时也不应该使用彩虹表。所以从理论上讲,应该没有太大区别。但是,我不是专家,所以我想听听您的意见。
我知道使用众所周知且经过良好测试的哈希算法而不是自己设计是很重要的。为此,通常有可用的参考实现,它们使用手动选择的随机数初始化所需的常量。
当我使用这样的实现时,选择自定义常量是否会提高安全性?我希望攻击者在暴力破解我的哈希时使用最有可能的值,这些值来自参考。
一个强大的加密散列算法不应该是可破解的,即使在使用加盐时也不应该使用彩虹表。所以从理论上讲,应该没有太大区别。但是,我不是专家,所以我想听听您的意见。
不 。常量是使散列安全的一部分,规范中的常量是加密社区对我们目前认为安全的散列函数的检查中使用的。已经表明,故意选择错误的常量可以以微妙但可利用的方式破坏散列函数,并且想出自己的常量也可能无意中给你留下一个弱散列函数。
不,由于您已经说过的原因:不要设计自己的算法。您可以通过使用独特的 salts来实现彩虹表的阻力,而无需弄乱散列算法的常量。这些算法已经过国际专家的彻底密码分析,例如NIST SP800-90 Dual Ec Prng,您可能没有资源为您的常量做同样的事情。然而,在大多数情况下,这些数字是非常随机地选择的。在某些情况下,您甚至可能从选择自己的常量中获得优势,但我仍然不推荐这样做。
编辑: fsmv指出你不应该自己实现哈希,而应该使用库。我同意。如果您真的想使用自己的常量,请获取算法的知名库实现(注意许可证),并将您的更改应用于该代码。这些实现已实现抗侧信道攻击。
我不是安全专家,但 NSA 前一段时间故意为 NIST 标准之一选择易破坏常量,这不是坏名声吗?
我猜这取决于您的威胁模型。如果您担心 NSA,那么也许您应该聘请世界上最好的密码学家并让他们找到更好的常数。否则,只需遵循标准中的内容,因为它们很可能对其他代理非常安全。
简短的回答:没有
常数是算法的一部分。如果你不相信常数,那么就不要相信算法。值得看一些例子。
Merkle-Damgård 哈希
在这种算法中可以改变的一个常数是 IV。对于安全分析,更改 IV 等同于在数据前添加一个密钥材料块。但是由于不需要更改实际算法,因此优先考虑。
然而,众所周知,仅仅预先添加一些密钥材料并不是构造密钥散列的好方法。更好的方法是使用 HMAC 结构。
IV 不是 Merkle-Damgård 哈希中唯一的常数。压缩函数中也有常数。如果您选择自己的常数,则存在很大的风险,即由于某种原因它们会变弱。因此,即使所有研究都指向原始版本是安全的,您的版本也可能很弱。如果在原始算法中发现弱点,您就不太可能想出更好的常数。
实际上,为了在这种情况下提出更好的常数,您基本上必须找到弱点和解决方案。换句话说,如果你不能写一篇关于为什么你的常数比原来的更好的论文,并且不能让它在密码学期刊上被接受,那么你的常数也不会更好。
DECDRBG
这是不信任常量的一个很好的例子。原始常量没有解释它们是如何构造的。这是一个警告信号,不应信任这些常量。
对如何构建这些常数的进一步分析揭示了一个可能的后门。整个算法现在被认为是可疑的。
如果您想使用该算法,则不应使用原始的不受信任的常量。但是如果你生成了自己的常量,你怎么能让其他人相信你的常量呢?
事实上,根据我们现在的知识,使用非标准常量的 DECDRBG 是使用您自己的后门创建加密算法并使其看起来像一个无辜的错误的最简单方法之一。
DECDRBG 说明了为什么一旦对算法中的常数有正当的怀疑,在有人提出真正的标准来决定什么是算法的好常数之前,你不应该信任该算法。