“SHA-2”和“SHA-256”有什么区别

What is the difference between “SHA-2” and “SHA-256”

我对 SHA-2 和 SHA-256 之间的区别有点困惑,经常听到它们可以互换使用。我认为 SHA-2 是一种 "family" 哈希算法,而 SHA-256 是该系列中的一种特定算法。谁能解惑。

维基百科:

The SHA-2 family consists of six hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

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 位 CPUs 上)并且可能更安全(由于更大的内部状态),引入了两个使用 64 位字但更短的新变体输出。这些就是已知的 512/224 和 512/256。

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

也可以简单地将最终输出截断为您想要的长度。例如,HMAC 构造指定将最终散列输出截断为所需的 MAC 长度。由于 HMAC 将哈希的一次调用的输出作为输入提供给另一次调用,这意味着使用具有较短输出的哈希会导致 HMAC 具有较少的内部状态。出于这个原因,使用 HMAC-SHA-512 并将输出截断为 384 位可能比使用 HMAC-SHA-384.

稍微更安全。

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