我对SHA-2和SHA-256之间的区别感到有点困惑,并经常听到它们互换使用。我认为SHA-2是一个"家庭"哈希算法和SHA-256是该系列中的一种特定算法。任何人都可以解决这个困惑。
答案 0 :(得分:5)
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位变体的速度来说,你的速度不会翻倍,因为64位变体确实具有比32位变体更多的轮数。
对于两个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。
答案 1 :(得分:3)
百科:
SHA-2系列由六个具有摘要的哈希函数组成(哈希 值)224,256,384或512位:SHA-224,SHA-256,SHA-384, SHA-512,SHA-512/224,SHA-512/256。