3

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

4

2 回答 2

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 位变体不会使速度翻倍,因为 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。

于 2015-10-16T19:00:19.530 回答
4

维基百科:

SHA-2 系列包含六个哈希函数,其摘要(哈希值)为 224、256、384 或 512 位:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA -512/256。

于 2015-10-16T16:23:02.570 回答