SHA-256 究竟是什么 Cuadernos Lacre · 概念 · 2026年5月19日 https://solo2.net/zh/notebooks/articulos/what-sha-256-actually-is.html 一个仅占六十四个字符的数学指纹,只要原始文本移动一个逗号,它就会完全改变。为什么我们称之为数字火漆印章。 --- 技术名称背后的简单理念 想象一下有一台机器,只有一个插槽和一个屏幕。你从插槽输入一段文本:一个词、一句话,或者一整本小说。屏幕上随后会出现一段恰好六十四个字符的序列。这段序列,对于专业读者,我们称之为 hash(哈希)或 加密摘要;对于普通读者,我们可以暂时称之为文本的数学指纹,就像人的指纹一样。 如果你两次输入相同的文本,机器两次都会显示相同的指纹。如果你输入稍有不同的文本——一个逗号被移动,一个大写字母变成小写——机器显示的指纹将与第一个完全不同。不是相似:而是完全不同。这两项属性结合在一起——确定性和敏感性——就是这个简单的理念。SHA-256 的其他一切都是确保它们良好运行的机制。 有必要从一开始就说明这台机器不做什么。它不加密文本。它不隐藏它。它不保存它。机器查看文本,计算指纹,然后忘记该文本。指纹不允许重建产生它的文本;它只允许在给定候选文本的情况下,检查它是否与原始文本一致。这就是为什么我们说它是一个 单向 的摘要:有去无回。 哈希不等同于加密 这种混淆很常见,有必要澄清:加密 (cifrar) 和哈希 (hashear) 是不同的操作。加密涉及对文本进行转换,以便只有持有密钥的人才能将其恢复为原始形式。哈希涉及生成文本的指纹,无论是否有密钥,原始文本都永远无法从中恢复。前者在设计上是可逆的;后者在设计上是不可逆的。 实际后果很重要。当一个应用程序说“我们存储您的加密密码”时,总有人拥有解密它的密钥——无论如何,是应用程序本身。当一个应用程序说“我们存储您的哈希密码”时,应用程序本身即使想读也读不出原始密码;它只能检查你输入的密码是否再次产生相同的指纹。对于存储密码,如果操作得当,第二种模型比第一种模型要好得多。稍后我们将看到为什么“操作得当”需要的不仅仅是纯粹的 SHA-256。 使加密哈希函数发挥作用的四个属性 一个配得上 加密(cryptográfico)这个形容词的哈希函数必须满足四个属性: 1. 确定性。 相同的输入总是产生相同的指纹。 2. 雪崩效应。 输入的微小变化会产生完全不同的指纹,与之前的指纹没有明显的相似性。 3. 抗原像性(抗逆转性)。 给定一个指纹,在计算上寻找产生它的文本是不可行的。 4. 抗碰撞性。 在计算上寻找产生相同指纹的两个不同文本是不可行的。 “在计算上不可行”并不意味着“在数学上是不可能的”。它意味着实现这一目标的时间、能源和金钱成本超出了合理可用计算能力总和的几个数量级。对于 SHA-256,即使使用专用硬件的最乐观方案,该阈值也以数千万亿年计。这对于读者的实际目的来说,就等同于“不可能”。 具体到 SHA-256 名字说明了一切。SHA 是 Secure Hash Algorithm 的缩写:安全哈希算法。数字 256 表示指纹的大小(以位为单位):256 位,即 32 字节,以十六进制显示时,就是读者已经识别出的 64 个字符。该标准由美国 NIST(对这类函数进行规范化的机构)于 2001 年作为 SHA-2 家族的一部分发布;该标准的现行版本 FIPS 180-4 是 2015 年发布的。 这些维度值得关注一下。256 位允许 2 的 256 次方个不同的值:这是一个包含 78 位十进制数字的数字,比可观测宇宙中估计的原子数量还要大几个数量级。世界上的每一段文本——每一本书、每一封电子邮件、每一条消息——都会落入这些值之一。两个不同文本偶然重合的概率,在实际应用中,与零无异。 代码中的体现 为什么我们称之为火漆印章 在 15 至 19 世纪的欧洲通信中,火漆(lacre)被用来封信。一滴熔化的蜡,上面压着一个印章,信件就被打上了不可重复的标记。它并不能防止有心人的偷窥——信纸可以透光阅读,火漆可以被破坏——但它确实能提供证据。在打开信纸之前,收信人就能看到封口是否有改动。火漆并不能阻止破坏,它只是揭示了破坏。 每本 Cuaderno 正文的 SHA-256 在数字版本中起着同样的作用。如果在发布到你阅读之间,文章中的一个词发生了变化,文本底部的十六进制印章将不再与你面前文本的 SHA-256 匹配。任何读者只要写五行代码就能验证。出版物无法在不被印章识破的情况下重写历史。它不防止破坏,但它使破坏可验证。 哈希函数不是什么 有时人们要求 SHA-256 执行四个不属于它的任务: 1. 加密。 哈希是摘要,不是隐藏。如果你希望文本无法被读取,你需要加密它,而不是哈希它。 2. 验证作者。 哈希并不说明谁编写了文本,只说明哈希了什么文本。要关联作者身份,需要在哈希之上进行加密签名,而不仅仅是哈希本身。 3. 存储密码。 这里有一个陷阱需要理解。SHA-256 设计得非常快——这对许多事情都有好处,但对这件事却很糟糕。使用专用硬件的攻击者每秒可以针对 SHA-256 哈希值测试数十亿个密码,直到找到你的密码。存储密码必须使用故意设计的慢速密钥派生函数,如 Argon2、scrypt 或 bcrypt,并结合“盐”(salt,每个用户唯一的随机数据,可防止两个拥有相同密码的人产生相同的哈希值)。 4. 将哈希值读作作者标识符。 它不是。哈希值标识内容。如果两个人使用 SHA-256 哈希单词 hola,他们都会得到相同的摘要——这是核心属性,而不是缺陷:如果摘要不同,我们就无法检查发布内容与接收内容是否一致。 SHA-256 出现在你日常生活的哪里 虽然你看不到,但 SHA-256 支撑着你在互联网上日常使用的很大一部分功能。比特币区块链通过将每个区块的 SHA-256 链接到下一个区块来构建;更改过去的区块将迫使重新计算之后的所有链。Git(世界上大部分代码版本管理的系统)通过其完整内容的 SHA-256(在最近版本中)或其前身 SHA-1(在较旧版本中)来标识每次提交。当你访问网站时,用于验证网站身份的 HTTPS 证书带有一个关联的 SHA-256 指纹。软件下载通常附带开发者发布的 SHA-256,以便你验证文件在传输过程中未被篡改。而且,正如我们所说,出现在每本 Cuadernos Lacre 的底部。 给专业读者 给决策或审计系统的人员的四个操作提醒: 1. 哈希不是加密。如果供应商在其技术文档中混淆了这两个术语,有必要询问其确切含义。 2. 对于存储密码,绝不应直接使用 SHA-256。SHA-256 对于这项任务来说太快了(参见 哈希函数不是什么 的第 3 点)。当前的标准是 Argon2id:设计上很慢,可根据服务器能力进行配置,并结合每个用户不同的随机“盐”。 3. 对于文件(合同、档案、文件)的完整性,SHA-256 仍然是参考标准。它是欧盟合格时间戳服务机构所使用的标准。 4. 对于长期保存(数十年),建议在 SHA-256 的基础上同时计算并存档 SHA-3 或 SHA-512;加密审慎性建议在长达一个世纪的存档中不要仅依赖单个函数。 想象一下,你搭建了世界上最精细的多米诺骨牌线路:成千上万块骨牌、数十个分支、机械桥梁和横跨整个房间的斜坡,每一块都是精心摆放的。 如果你轻触第一块骨牌,骨牌链会按照精确且可重复的顺序倒下。相同的摆放方式,相同的初始触碰 → 骨牌倒下的最终图案也会一次又一次地完全相同。 有趣的地方在这里:在开始前,将 仅仅一块骨牌 向旁边移动半厘米,然后再次触碰。原本应该激活的斜坡保持不动,桥梁没有倒下,触发了不同的分支。地面上骨牌的最终图案与第一次相比,将完全无法辨认。 SHA-256 在数学上就是这条线路。你输入的文本就是骨牌的初始位置。算法就是释放连锁反应的那次触碰。而最终结果——我们称之为 哈希 (hash) ——就是一切停止后地面的固定照片。改变原始文本中的一个逗号,照片就会截然不同。就是这么简单,也这么彻底。 --- 如果你回到本文末尾,你会看到一个六十四字符的十六进制印章。它是你刚才阅读的文本(以该语言)的 SHA-256。如果我们翻译这篇文章,印章就会不同;如果西班牙语版本改动了一个词,西班牙语印章就会改变。印章并不保护内容——那是其他工具的作用——但它唯一地标识了内容。尽管这听起来很微不足道,但它足以确保编辑链中的任何环节都无法在不被察觉的情况下篡改内容。其他一切——加密、签名、身份验证——都建立在这个简单的理念之上。 来源及延伸阅读 - NIST — FIPS PUB 180-4: Secure Hash Standard (SHS), 2015年8月。SHA-2 家族的官方规范,包括 SHA-256。 - RFC 6234 — US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF), IETF, 2011年5月。开发者的规范版本。 - Ferguson, N.; Schneier, B.; Kohno, T. — Cryptography Engineering: Design Principles and Practical Applications (Wiley, 2010)。第 5 章和第 6 章涵盖了哈希函数及其合法与非法用途。 - Nakamoto, S. — Bitcoin: A Peer-to-Peer Electronic Cash System (2008)。在不可变结构中链接区块使用 SHA-256 的实际案例。 - 欧盟第 910/2014 号条例 (eIDAS) — 合格时间戳服务框架。SHA-256 是欧盟颁发的合格电子签名和电子印章的参考函数。 - Zig 语言参考实现:该语言官方仓库中的 std.crypto.hash.sha2.Sha256 (github.com/ziglang/zig → lib/std/crypto/sha2.zig)。这是 Solo2 实际使用的优化和审计版本。有助于与附录中的教学实现进行对比。 --- Cuadernos Lacre · Menzuri Gestión S.L. 的出版物 · 由 R.Eugenio 撰写 · 由 Solo2 团队编辑。 https://solo2.net/zh/notebooks/