"SHA-2"和"SHA-256"有什么区别

Usm*_*aja 2 sha256 sha2

我对SHA-2和SHA-256之间的区别感到有点困惑,经常听到它们互换使用.我认为SHA-2是哈希算法的"族",而SHA-256是该族中的特定算法.任何人都可以清除混乱.

Usm*_*aja 6

SHA-2系列由多个密切相关的哈希函数组成.它本质上是一种单一算法,其中变量之间的一些小参数是不同的.

初始规范仅涵盖224,256,384和512位变体.

变体之间最显着的差异是一些是32位变体,一些是64位变体.在性能方面,这是唯一重要的区别.

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

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

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

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

由于64位变体更快(在64位CPU上)并且可能更安全(由于更大的内部状态),因此使用64位字但更短的输出引入了两个新变体.这些是称为512/224和512/256的那些.

想要输出比内部状态短得多的变体的原因通常是对于某些用法而言,使用这样的长输出是不切实际的,或者输出需要被用作某些算法的输入特定算法的关键尺寸.

只需将最终输出截断为所需长度即可.例如,HMAC构造指定将最终散列输出截断为期望的MAC长度.由于HMAC将一个哈希调用的输出作为输入提供给另一个调用,这意味着使用具有较短输出的哈希导致具有较少内部状态的HMAC.因此,使用HMAC-SHA-512并将输出截断为384位比使用HMAC-SHA-384可能稍微安全一些.

SHA-2的最终输出只是内部状态(在处理长度扩展输入之后)被截断为所需的输出位数.SHA-384和SHA-512在同一输入上看起来如此不同的原因是为每个变体指定了不同的IV.