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

标签 sha256 sha2

我对 SHA-2 和 SHA-256 之间的区别有点困惑,并且经常听到它们互换使用。我认为 SHA-2 是哈希算法的“家族”,而 SHA-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 位 CPU 上)并且可能更安全(由于内部状态更大),因此引入了使用 64 位字但输出更短的两个新变体。这些就是所谓的 512/224 和 512/256。

想要输出比内部状态短得多的变体的原因通常是,对于某些用途来说,使用如此长的输出是不切实际的,或者输出需要用作某些采用输入的算法的关键具有一定的规模。

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

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

关于sha256 - “SHA-2” 和 “SHA-256” 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33126900/

相关文章:

java - 无法创建正确的 SHA256 哈希值

node.js - AWS4 S3 POST 签名计算失败示例

java - 如何使用 JCE 中的 PBEWITHHMACSHA256ANDAES_256 算法

php - 密码迁移 - Drupal SHA2 到 PHP MD5 版本

algorithm - SHA-2 的空间和时间复杂度

java - Kraken API在Java中的实现

ruby - Rails 3 - 使用 HMAC-SHA256 签名响应

python - 使用 M2Crypto 在 Python 2.4 中生成 SHA-256 哈希

ssl - SHA2 和 TLS1/SSL3

tomcat - 无法让 Tomcat JDBCRealm 使用 SHA2