开发者工具 · SHA 哈希计算器
SHA-256 与 SHA-512:字大小、轮数以及为什么 512 可以更快
· 工作原理
sha-256 密码学 性能 浏览器 API
SHA-512 生成更长的摘要,但通常在 64 位硬件上运行得更快。这篇文章解释了两者之间的结构差异以及 SHA-384 如何适应,以便您可以根据事实进行选择。
哈希值越长,运行速度越快? — 开始比较的反直觉观察
SHA-512 生成更长的摘要,但在 64 位硬件上通常比 SHA-256 运行得更快。与直觉相反的观察结果来自 CPU 设计:针对 64 位算术优化的处理器对相同数据执行 64 位操作的速度比执行 32 位操作的速度更快。 SHA-256 对 32 位字进行操作,而 SHA-512 对 64 位字进行操作。在 64 位 CPU 上,后者更自然地适合硬件,并且在字大小转换和填充上花费更少的时间。
这并不会使 SHA-512 本质上更适合每个用例。较长的摘要需要更多的存储和带宽。应根据您的输出大小要求和平台来选择它们,而不是模糊地“更新”或“更强”。
32 位与 64 位字 — 核心结构差异及其适合现代 CPU 的原因
SHA-256 在整个算法中对 32 位字进行操作。消息调度将 16 32 位字扩展为 64 32 位字。每轮更新八个 32 位工作变量。消息块为 512 位(十六个 32 位字)。输出为 256 位(八个 32 位字)。所有算术均在 32 位值上完成,并在 2^32 处进行溢出包装。
SHA-512 对 64 位字进行操作。消息调度将 16 64 位字扩展为 80 64 位字(不是 64,如 SHA-256 中那样)。每轮更新八个 64 位工作变量。消息块为 1024 位(十六个 64 位字)。输出为 512 位(八个 64 位字)。所有算术均在 64 位值上完成,并在 2^64 处进行溢出包装。
64 轮与 80、512 位与 1024 位块 — 每个块和每个字节有何变化
SHA-256 每块运行 64 轮; SHA-512 每个区块运行 80 轮。这意味着 SHA-512 每个块会进行更多混合。乍一看,这听起来比较慢。但较大的字大小和块大小意味着 SHA-512 每轮处理更多位。对于 1 兆字节文件,SHA-256 处理 1048576 / 512 = 2048 块,每个块有 64 轮,总共 131072 轮。 SHA-512 处理 1048576 / 1024 = 1024 块,每个块有 80 轮,总共 81920 轮。 SHA-512 总共执行的轮次较少,尽管它每个块执行的轮次较多。
挂钟时间的差异取决于 CPU 对字大小的优化。具有 64 位 ALU(算术逻辑单元)的 CPU 将有效执行 64 位运算。如果同一个 CPU 必须将 32 位 SHA-256 操作分解为多个微操作或在较小的执行单元上运行它们,则每个操作的成本会更高。现代处理器针对 64 位操作进行了优化,使得 SHA-512 通常更快,尽管每个块有额外的轮数。
块大小和轮数解释每个字节的工作;实际吞吐量需要平台基准
块算术解释了为什么较长的输出不一定意味着每个字节需要更多的工作。 SHA-256 对每个 512 位块执行六十四轮,而 SHA-512 对每个 1,024 位块执行八十轮。第二种设计在每个块上执行更多轮次,但每次处理一个块时都会消耗两倍的输入量。
该结构比较并不能预测特定的浏览器基准。 Web Crypto 可以使用本机指令、操作系统库或其他优化代码,并且输入长度会改变设置所花费的份额。当吞吐量很重要时测量实际目标环境;该存储库仅支持定性声明,即更宽的字可以适合 64 位硬件。
输出长度影响表示和安全属性,无需无源攻击工作估计
SHA-384 不是一个单独的算法;它是 SHA-512,有两个变化:初始哈希常量不同,输出被截断为 384 位(48 字节),而不是完整的 512 位。这种截断有利于抵御长度扩展攻击:攻击者无法通过将数据附加到原始消息来扩展摘要,因为完整的 512 位状态未知(仅披露了 384 位)。
SHA-256 容易受到长度扩展攻击:如果您知道消息的摘要并且知道消息长度,则可以将数据附加到消息并计算扩展消息的摘要,而无需知道原始消息的内容。这在特定的安全环境中很重要,例如使用弱结构的 HMAC 实现。 SHA-384 尽管基于 SHA-512,但不易受到攻击,因为完整状态未公开。这使得 SHA-384 在 SHA-256 被认为有风险的情况下很有用。
工作示例 - 将一个输入与所有三个输入进行散列并并排比较摘要长度
输出大小是最直接的区别。 SHA-256 产生 32 字节(64 十六进制字符); SHA-384 产生 48 字节(96 十六进制字符); SHA-512 生成 64 字节(128 十六进制字符)。对于存储在 URL 或 JSON 中,摘要越长,占用的空间就越多。对于碰撞抵抗,较长的输出使得碰撞的发现变得更加困难。更宽的输出提供了更大的结果空间,而它们的直接结果更容易测量:存储、URL 和协议字段中的字节数更多。本文没有附加攻击工作估计,因为没有任何估计是从存储库证据中得出的。
某些系统和标准明确指定 SHA-256;其他人使用 SHA-512 或允许选择。 SSH 指纹默认为 SHA-256;容器映像摘要可以是 SHA-256 或 SHA-512。像 npm 这样的包管理器使用 SHA-512 来保证子资源的完整性。选择通常是为您做出的,但了解差异可以让您在有发言权时做出明智的选择。
这不包括 — 吞吐量数据,这取决于 CPU、编译器和输入大小;帖子保持质量
ToolAcre SHA 哈希计算器提供 SHA-256、SHA-384 和 SHA-512。使用所有三个哈希相同的输入并观察输出长度。这些摘要将彼此完全不同,这是预期的:算法使用不同的轮常量、不同的消息调度和不同的混合操作。摘要旁边显示的字节数仅反映输入大小,而不反映输出大小;所有三种算法通过各自的轮序列以相同的方式处理相同的输入字节。
在您自己的硬件上进行测试可以揭示性能差异。使用每种算法对一个大文件(一个多兆字节的测试用例)进行哈希处理并对结果进行计时。在现代 64 位系统上,SHA-512 通常会在更短的挂钟时间内完成,即使字节计数可能表明情况并非如此。在 32 位系统或嵌入式处理器上,SHA-256 可能会更快,因为 CPU 的 ALU 针对 32 位操作进行了优化。
要点:按输出大小和平台进行选择 — ToolAcre SHA 哈希计算器提供 SHA-256、SHA-384 和 SHA-512,因此您可以在同一输入上看到所有三个
加密强度与性能是分开的。存储库不会将 SHA-256 标记为已损坏,并选择它作为通用默认值。产品证据并不能证明任何原始产品都是普遍安全的。适用性仍然取决于构建和威胁模型。从 SHA-256 切换到 SHA-512 不是安全升级;这是存储和性能的权衡。如果您的系统指定 SHA-256 并且您需要该精确算法,请使用它。如果您有选择并且想要更长的摘要,或者您知道您的平台是 64 位,则 SHA-512 是一个有效的选择。
浏览器的 Web Crypto 实现通过 crypto.subtle.digest 计算所有三个。您的设备、浏览器版本和后台系统负载都会影响观察到的性能。但关键点仍然是:SHA-256 和 SHA-512 并不是在争夺“最佳哈希函数”的称号。它们是为不同的输出要求而设计的工具,它们之间的选择是根据您的系统需求而不是一般的性能要求进行的。