如何计算 SHA 摘要
选择文本或文件、算法和输出编码后生成。文本会先编码为 UTF-8;文件模式读取本地文件的原始字节并交给 SubtleCrypto.digest,不会先转成文本。
- 选择文本或文件。文件内容不会经过字符解码。
- 新的一般用途通常选择 SHA-256;只有协议明确要求时选择 SHA-384 或 SHA-512。
- 常见校验值展示用十六进制,需要更紧凑传输时按协议选择 Base64。
- 比较完整摘要与可信来源。匹配支持完整性,但预期摘要本身还需要可信渠道。
案例与预期行为
| 输入 | 输出 | 说明 |
|---|---|---|
| abc + SHA-1 | a9993e364706816aba3e25717850c26c9cd0d89d | 标准向量,仅用于兼容测试。 |
| abc + SHA-256 | ba7816bf8f01cfea414140de5dae2223… | SHA-256 为 256 位,即 64 个十六进制字符。 |
| abc + SHA-384 | cb00753f45a35e8bb5a03d699ac6500… | SHA-384 为 384 位,即 96 个十六进制字符。 |
| abc + SHA-512 | ddaf35a193617abacc417349ae204131… | SHA-512 为 512 位,即 128 个十六进制字符。 |
| 你好(UTF-8) | 确定性 SHA 摘要 | 文本按 UTF-8 字节哈希,不按 UTF-16 代码单元。 |
| 本地文件 | 文件精确字节的摘要 | 任意一个字节、内嵌元数据或换行变化都会改变结果。 |
哈希函数与确定性结果
密码学哈希把任意长度输入映射成固定长度摘要。同一字节序列总是得到同一结果,输入轻微变化应产生完全不同的摘要。摘要不包含可逆原文。
确定性适合完整性检查、内容寻址、缓存键和构建记录,但不意味着低熵秘密会被安全隐藏。攻击者可以枚举候选密码并比较摘要,密码存储必须使用带盐且计算缓慢的专用算法。
- SHA-256 输出 32 字节。
- Hex 每字节用两个字符。
- Base64 只是同一摘要字节的另一种文本表示。
算法选择与 SHA-1 警告
SHA-256、SHA-384 和 SHA-512 属于 SHA-2。应选择校验值、API 或标准明确指定的算法,不同算法的摘要不能互换。更长并不自动代表周边协议实现正确。
SHA-1 仅为旧系统和历史校验值保留。实际碰撞攻击使它不适合新的签名、证书、软件分发和对抗性完整性决策。需要安全时应迁移到 SHA-256 或更强的合规构造。
- 不要用 SHA-1 对抗有能力的攻击者。
- 不要只凭摘要长度猜算法。
- HMAC 与普通哈希不同,需要密钥。
文本编码与文件原始字节
文本使用 TextEncoder 转为 UTF-8。视觉相同的字符串可能因 Unicode 规范化、不可见字符、尾随空格和换行不同而产生不同字节。本工具不做规范化。其他系统若使用 UTF-16 或旧编码,结果也会不同。
文件模式对 File.arrayBuffer 返回的字节计算摘要,不把文件名、MIME 类型和修改时间加入输入,除非这些信息本身写在文件内容中。重新保存图片或文档可能改变内嵌元数据;CRLF 与 LF 是文本文件常见差异。
- 精确保留末尾换行和空格。
- 排查不匹配时先比较文件大小。
- 协议哈希人类文本时应记录编码和规范化规则。
完整性与信任模型
摘要匹配说明两份输入在所选算法下极可能字节相同,但不证明是谁创建了文件,也不证明预期摘要可信。如果攻击者能同时替换下载文件和网页上的摘要,普通哈希比较无法提供真实性。
预期摘要应来自签名发布清单、可信包管理元数据或其他认证渠道。共享密钥消息认证使用 HMAC,公开软件来源验证使用数字签名和可信公钥。哈希只是构件,安全结论由信任链决定。
- 比较完整摘要,不要只比短前缀。
- 安全代码中采用常量时间比较。
- 保存摘要时同时记录算法。
常见用途与排查流程
适合验证下载文件、比较两个导出是否相同、记录构建产物、生成缓存键和检查标准向量。本地文件哈希无需上传,文本哈希可排查 API 规范化和编码差异。
要复现结果,应记录原始输入、算法、输出编码以及文本规范化规则。摘要不一致时先检查字节长度、换行、Unicode、压缩和内嵌元数据,不要在工单中粘贴敏感原文。
- 验证可信发布者提供的校验值。
- 不上传即可比较本地文件。
- 实现密码学功能时检查标准向量。
- 排查 UTF-8 与其他编码差异。
浏览器限制与非目标
必须有 Web Crypto;不可用时会失败,不会使用未经审查的纯 JavaScript 实现。文件会整体读入内存,因此多 GB 文件可能占用大量内存,应该使用流式原生工具。
本页不破解哈希、不加密、不签名、不识别未知算法,也不用于密码存储。它不会上传文件到恶意软件数据库。输出只是所选算法对输入字节的摘要。
- 用户选择文件前页面不会读取任何文件。
- 清空表单不能清除操作系统缓存。
- 密码使用 Argon2、scrypt 或 bcrypt 等专用方案。
与 HMAC 和 UUID 的区别
普通哈希没有密钥,任何拿到数据的人都能重算;HMAC 把密钥与消息结合,用于共享密钥真实性和完整性。UUID v4 是随机标识,与内容无关,不能检查内容是否变化。
校验和用哈希,带密钥认证用 HMAC,公开可验证真实性用数字签名,随机标识用 UUID。虽然输出都像长字符串,但不能互相替代。