开发者工具 · SHA 哈希计算器
长度扩展攻击:为什么 SHA-256(secret + message) 不是 MAC
· 为什么它很重要
sha-256 密码学 安全
在消息中添加秘密并对其进行哈希处理看起来像身份验证,但 SHA-256 的结构允许攻击者在不知道秘密的情况下扩展消息。这篇文章解释了攻击和修复。
自制请求签名 — hash(secret + body) 以及为什么它感觉安全
开发人员需要消息身份验证,但缺乏 HMAC 知识,因此他们将秘密与消息连接起来并对结果进行哈希处理。这种方法乍一看很安全:输出是固定大小的指纹,如果有人修改消息,该指纹就会改变。然而,SHA-256 有一个称为长度扩展的架构缺陷,攻击者可以将数据附加到消息中并在不知道秘密的情况下计算有效的摘要。 ToolAcre SHA 哈希计算器仅计算普通摘要,而不计算密钥身份验证,因为这种区别对于真正的安全性很重要。
在散列之前预先添加一个秘密在直观上很有吸引力,因为只有秘密持有者才能重新计算散列。如果消息发生变化,哈希值也会发生变化,因此它看起来像是真实性的证明。 API 可以通过连接共享密钥和请求正文来对请求进行签名,然后对结果进行哈希处理并将该哈希值包含在请求中。服务器接收正文,用其密钥副本重新计算哈希值,并检查其是否匹配。如果攻击者更改主体,哈希值将不匹配——至少开发人员是这么认为的。
Merkle–Damgård 泄露其状态 — 最终摘要是内部状态,因此攻击者可以从您停止的位置继续进行散列
SHA-256 属于 Merkle–Damgård 哈希函数家族。这些函数处理固定大小块中的输入,链接一个压缩函数,该压缩函数采用先前状态和当前块并输出新状态。压缩函数是内部唯一的加密原语;链接策略和填充方案使整个构建工作正常进行。最终摘要只是以十六进制打印的最终状态。这并非偶然:输出是内部状态。任何看到摘要的人都拥有从该点继续散列所需的确切状态。
为了扩展消息,攻击者从观察到的 Secret + Original_message 摘要开始,并将其视为新压缩函数调用的状态变量。他们附加想要添加的数据,正确填充完整的新消息长度,然后计算摘要。当服务器通过预先考虑其自己的秘密和散列来验证此伪造的摘要时,在吸收初始秘密后,计算的进行与攻击者的计算相同。服务器计算相同的摘要,并且在攻击者完全不知道秘密的情况下接受伪造的消息。
扩展的工作原理 — 附加填充和额外数据来为更长的消息伪造有效的哈希值
不同的算法受长度扩展的影响不同。 SHA-1 存在漏洞:攻击者可以观察 SHA-1 摘要并扩展消息。 SHA-256 也同样容易受到攻击。 SHA-512 也容易受到扩展攻击。 SHA-384 抵抗长度扩展,因为它被构造为 SHA-512 截断为 384 位。压缩函数输出比发布的摘要长,因此攻击者没有足够的信息来继续散列。 SHA-3 中使用的海绵结构也具有抵抗力,因为它不会泄漏内部状态。
要了解哪些算法容易受到攻击,需要了解压缩函数大小与发布的摘要大小之间的关系。 SHA-256 发布 256 位,压缩函数状态也是 256 位,因此摘要是整个状态。攻击者拥有继续攻击所需的一切。 SHA-384 发布 384 位,但底层压缩函数状态是 512 位,因为 SHA-384 构建在 SHA-512 之上。摘要仅显示 512 位中的 384 位,而攻击者不知道 128 位。这是 SHA-384 的有意设计属性,提供了这种阻力。
支持的 SHA-1、SHA-256 和 SHA-512 结构公开完整状态; SHA-384 截断更改扩展边界
使用共享密钥对消息进行身份验证的修复方法是 HMAC,即密钥哈希消息身份验证代码。 HMAC 不会预先添加秘密和哈希值;相反,它使用称为内部填充和外部填充的特定填充方案在两个嵌套哈希运算中应用秘密。构造为 HMAC(secret, message) = SHA256(secret_XOR_outer_pad, SHA256(secret_XOR_inner_pad, message))。这种嵌套方法缩小了长度扩展差距,因为即使攻击者拥有内部哈希的摘要,他们也无法在没有秘密的情况下继续进行哈希处理。
将摘要和 HMAC 操作分开的原因是为了避免将两者互换对待的常见错误。通过一种兼具这两种功能的工具来学习哈希的开发人员可能会忘记在编写代码时使用的是哪一种。保持摘要计算分离使得选择更加明确,并强化了身份验证需要 HMAC 或签名的知识。 ToolAcre SHA 哈希计算器清楚地标记了普通摘要,并且文档解释了 HMAC 是完全不同的操作。
HMAC 作为修复 - 缩小间隙的嵌套结构以及为什么它是标准答案
长度扩展的概念示例适用于熟悉的测试向量 abc。对 ASCII 文本 abc 计算 SHA-256 会生成摘要 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad。假设此摘要是 Secret + abc 使用 5 字节秘密进行哈希处理的结果,总共给出 8 字节的输入。 SHA-256 处理 64 字节块中的输入,因此第一个也是唯一的块用消息长度和其他填充字节填充。攻击者看到摘要并想要伪造一条以 abc 开头、后跟额外数据的消息。
它们无法直接附加到 abc,因为它们不知道添加到哈希中的确切填充。但是,他们可以计算完整填充的消息必须是什么:abc 加上 8 字节输入到 64 字节块所需的填充。然后,他们附加额外的数据,计算新总长度的填充,并通过将观察到的摘要视为起始状态来对组合进行哈希处理。结果是服务器将接受的有效 SHA-256 摘要,因为它预先考虑了机密并计算相同的哈希值。
工作示例 — 在没有实时目标的情况下扩展签名消息的概念演练
为了在实际系统中防止这种攻击,开发人员不应尝试从纯哈希构建身份验证。 HMAC 是标准答案,而 ToolAcre SHA 哈希计算器是一种计算简单摘要的工具,用于完整性检查、内容哈希和类似的非身份验证目的。安全使用普通 SHA-256 摘要的示例包括文件校验和,其中攻击者无法同时控制文件和摘要;内容可寻址存储,其中哈希是查找键;数字签名与签名相结合,其中签名提供身份验证。
此问题的全部范围包括浏览器提供的其他算法。 SHA-1 很容易受到长度扩展的影响,并且在变得相关之前就已经被加密破解。 ToolAcre 计算器将 SHA-1 标记为仅旧版,并解释了使其不适合新应用程序的冲突攻击。对于新应用程序,SHA-256 是普通摘要的明智选择,如果需要身份验证,带有 SHA-256 的 HMAC 就是答案。 SHA-384 和 SHA-512 都容易受到攻击,但 SHA-384 受到截断保护。
这不包括什么 - ToolAcre 计算器计算普通摘要,而不是 HMAC;这篇文章解释了为什么这种区别很重要
在构建哈希函数的心智模型时,Merkle–Damgård 构造和长度扩展成为关键概念。哈希函数必须处理任意输入长度并产生固定输出。它的实现方式是逐块链接压缩函数,最终状态转换为输出的方式非常重要。如果完全输出最终状态,则该输出包含继续散列所需的所有信息。如果最终状态被截断,则部分被隐藏。
对于第一次阅读长度扩展攻击的开发人员来说,问题是如何知道它是否会影响他们的用例。如果哈希的输入是公共常量并且哈希用作查找密钥或指纹,则长度扩展无关紧要。如果当双方共享秘密时使用散列来验证消息,则长度扩展是一个严重的漏洞,而 HMAC 就是修复方案。 ToolAcre SHA 哈希计算器显示摘要和字节计数,清楚地表明这些是计算输出,而不是身份验证机制。
要点:使用 MAC 进行身份验证 — ToolAcre SHA 哈希计算器用于完整性摘要;身份验证需要 HMAC 或签名
将其应用于生产系统,原理很简单:当涉及机密时,切勿使用裸哈希进行身份验证。 HMAC 是完全封闭长度扩展攻击向量的标准结构。如果正确使用,SHA-256 和 SHA-384 都可以安全地实现其预期目的。了解三个关键点(Merkle–Damgård 在摘要中显示其状态、SHA-384 截断以隐藏部分状态以及 HMAC 使用嵌套结构来防止扩展)为开发人员提供了做出正确选择的工具。
ToolAcre SHA 哈希计算器体现了这一教学:它提供了用于学习和合法的非身份验证用途的简单摘要,它将 SHA-1 标记为遗留,并且它不实现 HMAC,因为该操作属于不同的上下文。当开发人员使用简单的哈希计算器来验证请求时,该工具的定位和文档会引导他们将 HMAC 和签名作为正确的工具。 ToolAcre 工具包重点关注浏览器的 Web Crypto 直接提供的内容,并解释每个原语适用的边界。