我对SHA-2和SHA-256之间的区别感到困惑,经常听到它们互换使用(这似乎是错误的)。我认为SHA-2是哈希算法的“系列”,而SHA-256是该系列中的特定算法。

对吗?有人可以澄清一下吗?

#1 楼

仅举维基百科为例:http://en.wikipedia.org/wiki/SHA-2:SHA-2系列由六个带有摘要(哈希值)的哈希函数组成分别是224、256、384或512位:SHA-224,SHA-256,SHA-384,SHA-512,SHA-512 / 224,SHA-512 / 256。


因此,是的,SHA-2是一系列哈希函数,包括SHA-256。

评论


考虑到SHA-3,最好将SHA-2变体称为SHA2-224,SHA2-256等,与SHA-3变体一样,但并不常见,所以很好。 SHA-1不会有多种大小,因此n较大的SHA-n始终意味着SHA-2的大小为n。

–霍布斯
2015年4月30日在2:02



#2 楼

SHA-2系列由多个紧密相关的哈希函数组成。它本质上是一个单一算法,其中变体之间的一些次要参数有所不同。 br />变体之间最显着的区别是,有些是为32位寄存器设计的,而有些是为64位寄存器设计的。在性能方面,这是唯一重要的区别。

在32位CPU上,SHA-224和SHA-256将比其他变体快很多,因为它们是32位CPU中唯一的变体。 SHA-2家庭。由于在32位CPU上执行64位操作会增加复杂性,因此在32位CPU上执行64位变体将变慢。

在64位CPU上,SHA-224和SHA-256将比其他变体慢一点。这是因为由于一次只处理32位,因此它们必须执行更多操作才能通过相同数量的字节进行处理。切换到64位变体的速度不会提高一倍,因为64位变体的确具有比32位变体更大的回合数。

内部状态的大小为256位对于两个32位变体,对于所有四个64位变体,尺寸为512位。因此,内部状态的可能大小的数量小于最终输出的可能大小的数量。从较大的内部状态变为较小的输出可能是好是坏,具体取决于您的观点。

如果保持输出大小固定,通常可以期望增加内部大小状态将提高安全性。如果您将内部状态的大小固定不变并减小输出的大小,则冲突发生的可能性更高,但是长度扩展攻击可能会变得更加容易。使输出大小大于内部状态将毫无意义。

由于64位变体速度更快(在64位CPU上)并且可能更安全(由于内部状态较大),因此引入了两个新变体,它们使用64位字但输出较短。这些就是所谓的512/224和512/256。

想要输出比内部状态短得多的变量的原因通常是,对于某些用法,使用这样的变量是不切实际的。较长的输出,或者对于某些需要一定大小输入的算法,需要将该输出用作键。

也可以将最终输出简单地截断为所需的长度。例如,HMAC构造指定将最终的哈希输出截断为所需的MAC长度。由于HMAC将哈希的一次调用的输出作为另一次调用的输入,这意味着使用具有较短输出的哈希会导致具有较少内部状态的HMAC。因此,与使用HMAC-SHA-384相比,使用HMAC-SHA-512并将输出截断为384位可能更安全。简单地将内部状态(在处理长度扩展输入之后)截断为所需的输出位数。同一输入上的SHA-384和SHA-512看起来如此不同的原因是,为每个变体指定了不同的IV。