就安全强度而言,使用SHA-256算法与使用SHA-512算法输出的任何随机256位有什么区别吗?

同样,使用SHA-256算法与使用SHA-256算法的输出有何安全区别? SHA-224并使用SHA-256输出的任意224位随机数?

评论

这可能是部分欺骗,但是我认为确实达到了更适合于加密的水平。

相关:我应该使用sha-256哈希中的第一位还是最后一位? 128位哈希,发生冲突的可能性最小

#1 楼

据我们所知,SHA-512被截断为256位与SHA-256一样安全。 NIST基本上是通过2012年3月在FIPS 180-4中引入SHA-512 / 256来做到这一点的(因为在许多64位CPU上用软件实现时,SHA-256 / 256的速度比SHA-256快)。 SHA-224与使用224位SHA-256一样安全,因为基本上就是SHA-224的构造方式。保留哪些位(假设是固定的)对安全性无关紧要,但是为了符合NIST规范,应保留剩余的位。该功能仅假定是防碰撞或防原像的,限制其输出可能使其完全不安全。一个简单的例子是通过在SHA-256的输出上附加256个零而获得的512位函数,它既具有防碰撞性又具有抗原像的功能,但是如果仅限于其256个右位,则是不安全的。
SHA-2函数的设计目标是图像前抵抗力和碰撞抵抗力:“在本标准中指定的哈希算法被称为安全算法,因为对于给定算法,在计算上是不可行的1)查找与给定消息相对应的消息摘要,或2)查找产生相同消息摘要的两条不同消息”。因此,本书并未对SHA-2函数进行截断。
更新:FIPS 180-4,它定义了SHA-2函数SHA-224,SHA-256,SHA-384,SHA-512,SHA- 512/224和SHA-512 / 256在其第7节中明确认可了截断:“某些应用程序可能要求散列函数的消息摘要长度与本标准中散列函数提供的消息摘要长度不同。可以使用摘要,从而将具有较大消息摘要长度的哈希函数应用于要进行哈希处理的数据,并通过选择适当数量的最左边的位来截断结果消息摘要。”
据我们所知,截断SHA-2函数是安全的。这就是从SHA-256的轻微变体构造SHA-224以及从SHA-512的轻微变体构造SHA-384,SHA-512 / 224和SHA-512 / 256的基本原理(更改内部初始化向量,以避免一个函数的输出显示另一个函数的输出)。
之所以可以安全地截断SHA-2函数的原因是,这些函数具有另一个未声明的设计我们达到的目标是,据我们所知,这是:与随机函数在计算上没有区别,除了具有长度扩展属性¹,而且是该特定函数。为了能够有信心使用随机Oracle模型中的协议证明来使用散列,必须具有强大的属性,并且暗示抗碰撞性和前映像抗性(反之则不成立)。函数的截断(通过保留其输出位的任何固定子集)与随机函数也没有区别(随机草图:截断函数的任何假设区分符都可以很容易地转换为原始函数的区分符,同样的努力和优势)。
该原理可以扩展到任何大小。例如据我们所知,SHA-512被截断为128位是一个128位哈希(无论我们保留哪个位)都可以,并且无疑比MD5(另一个128位哈希)更安全。耐冲击性严重受损)。但是,可以在大约$ 2 ^ {(n / 2)+0.33} $的散列,很少的内存和有效的并行化中找到$ n $位哈希的冲突(请参阅使用密码分析应用程序的并行冲突搜索)。因此,对于80位级别的安全性(在2000年代初期有时被认为是绝对的最低要求,并且在没有相反的论据的情况下,如今已被认为是不足的),当需要抗碰撞性时,我们应至少保留160位;并且仅需要保留原像电阻时,我们应该保留至少80位。的位串$ m $(但不是$ m $本身)和任何位串$ s $,可以有效地计算$ H(m \ mathbin \ | r_ \ ell \ mathbin \ | s)$其中$ r_ \ ell $是一个短的,有效计算的位串,仅取决于$ \ ell $。截断许多位会删除长度扩展属性。如在另一个答案中所指出的,长度扩展属性是不希望的伪像,并且是某些情况下攻击的基础。在不使用SHA-256的情况下,将SHA-512截断为256位是安全的。

评论


$ \ begingroup $
我什至要说它更安全,因为状态冲突变得更加困难,可以防止特定类型的多冲突。它还可以防止长度延长。
$ \ endgroup $
– CodesInChaos
2012年7月6日在13:42

$ \ begingroup $
@Pacerier:我引用了NIST规定使用最左边的位。他们最有可能这样做是为了避免不同实现的重复。但是没有理由相信我们需要这样做以确保安全。
$ \ endgroup $
–fgrieu♦
2012年7月8日在18:12

$ \ begingroup $
这个词很普通,是的。但是,它通常不涉及散列函数,而是涉及在ROM中证明是安全的其他加密方案。哈希函数(用于替换RO)本身甚至不在ROM中。只有在您尝试实施方案后,它才会发挥作用。
$ \ endgroup $
– Maeher
2012年7月10日在6:36

$ \ begingroup $
@Pacerier:SHA-512 / 224和SHA-512 / 256的输出大小(第二个数字,以位为单位)和初始化值(因此,SHA-512 / 224的结果不是以下内容的子集)不同另一个)。
$ \ endgroup $
–fgrieu♦
2014年2月13日下午5:58

$ \ begingroup $
@Pacerier:没有SHA-512 / 512,即SHA-512。 SHA-512和SHA-512 / 256(以及所有SHA-512 / xxx)的初始化值不同,并且512位结果的长度将被截断。所有SHA-512(/ xxx)共享相同的舍入常数。
$ \ endgroup $
–fgrieu♦
2014-02-15 13:56



#2 楼

如果我们谈论的是抗冲突性,那么-通常对于任何哈希函数-仅使用部分输出可能是一个问题。 H(m)= x || b $(其中b仅是一个位),我们构造了哈希函数$ H'$,使得$ H'(m)= x $,即它给出的输出与$ H $但没有最后一点。

我们可以证明,$ H $的耐碰撞性并不意味着$ H'$的耐碰撞性。
为此,我们构造了一个特定的防碰撞哈希函数$ H $,因此$ H'$不耐碰撞。

为此,我们假设存在第三个防碰撞哈希函数$ H''$并定义$ H(m || b)= H''(m)|| b $。 $ H $仍然具有抗碰撞性,因为$ H $以下的任何碰撞也会在$ H''$以下产生碰撞。但是,现在认为对于\ {0,1 \} ^ * $中的任何$ m \ $ H'(m || 0)= H''(m)= H'(m || 1)$和$ H '$因此不具有抗冲突性。

这似乎有点违反直觉,我们假设(并希望)对于常用的哈希函数(例如SHA-512)不是这种情况。

因此,简而言之:对于SHA-512之类的哈希函数,您可能会满意,但绝对不能保证。因此,除非绝对必要,否则不要弄乱它的输出,并且您真的知道自己在做什么。只需使用为该工作量身定制的工具即可。

评论


$ \ begingroup $
说过没有保证SHA-512被截断为256位的安全性的做法过于谨慎; NIST本身就使用这种技术来构建SHA-512 / 256,这是2012年3月FIPS 180-4的一部分;看我的答案。
$ \ endgroup $
–fgrieu♦
2012年7月6日15:41

#3 楼

其他答案没有提到对Merkle–Damgård结构的“长度扩展”攻击。长度扩展被赋予哈希值$ h $;
$$ h = \ operatorname {SHA-256}(\ text {IV},\ text {secret_key} \ mathbin \ | \ text {known_data} \ mathbin \ | pad1)$$
攻击者可以产生扩展名;
$$ \ operatorname {SHA-256}(\ text {IV},\ text {secret_key} \ mathbin \ | \ text {known_data } \ mathbin \ | \ text {pad1} \ mathbin \ |
\ text {append_data} \ mathbin \ | \ text {pad2})$$
可以通过更改$的初始值来执行\ operatorname {SHA-256} $作用于$ h $并哈希扩展。
$$ \ operatorname {SHA-256}(h,\ text {appended_data} \ mathbin \ | \ text {pad2})$ $
此攻击首次出现在2009年9月28日通过MD5伪造的Flickr API签名中。这是由于开头的秘密$$ \ operatorname {MD5}(\ text {SECRET} \ mathbin \ | \ text {message})$$
$$ operatorname {SHA-512 / 256} $的截断版本带有任何选定的256位,正如另一个答案指出的那样,它预期具有相同的原像,次要像$ \ operatorna的原像和抗碰撞性我{SHA-256} $。但是,$ \ operatorname {SHA-512 / 256} $的截断(任何选定的位或作为标准)使它能够抵抗长度扩展攻击,因为攻击者必须预测截断的256位才能扩展散列。由于$ \ operatorname {SHA-512 / 256} $是为64位CPU设计的,因此应该使用$ \ operatorname {SHA-512 / 256} $而不是$ \ operatorname {SHA-256} $。

总之,如果考虑长度扩展攻击,$ \ operatorname {SHA-512 / 256} $是更好的选择。

注意:长度扩展攻击不需要执行secret_key。没有它就可以工作。代替$ H(key \ mathbin \ | \ text {message})$签名,我们更喜欢HMAC-无长度扩展攻击且具有安全性证明-和KMAC。在设计上,基于SHA3的KMAC在设计上可以抵抗长度扩展攻击和KMAC构造,并且在这种情况下的证明比HMAC容易得多。