什么是 哈希生成器?
密码学哈希函数接受任意大小的输入,并产生固定大小的输出(即哈希值或摘要),它具有关键的安全属性:相同的输入始终产生相同的输出;输入的微小变化会产生完全不同的输出(雪崩效应);并且在计算上不可行将哈希值逆向还原为原始输入。我们的哈希生成器使用浏览器内置的 Web Crypto API 计算 SHA-1、SHA-256 和 SHA-512 哈希值。
哈希函数是安全性和数据完整性的基础。密码以哈希值形式存储,因此数据库泄露不会暴露真实密码。文件下载会附带 SHA-256 校验和以验证完整性。数字签名使用哈希函数来创建紧凑的文档摘要。Git 使用 SHA-1 来标识每个提交、树和 blob。我们的工具使用 SubtleCrypto(window.crypto.subtle)——与安全 Web 应用所用的 API 相同。
对于任何从事安全、认证或数据完整性工作的开发者来说,理解哈希至关重要。这个工具让哈希概念变得具体:输入文本,查看哈希值,改动一个字符,观察完全不同的输出。这种动手探索所建立的直觉,是单凭理论描述无法提供的。
使用场景
以下是人们每天使用 哈希生成器 的最常见场景。
文件完整性验证
软件下载、数据集和固件映像通常会附带已发布的 SHA-256 校验和。下载后,对文件计算哈希值并与已发布的校验和比较。哈希值匹配可确认文件完好无损。哈希值不匹配则表明已损坏或被篡改。Linux 发行版、安全研究人员和软件供应商就是这样验证文件真实性的。
密码哈希验证
在调试应用中的密码哈希时,验证你的函数对已知输入是否产生预期输出。如果你期望某个特定的 SHA-256 值,而应用产生了不同的哈希,则可能存在编码差异(UTF-8 与 UTF-16)、加盐不匹配或算法差异。我们的工具使用 UTF-8 编码和标准 SHA 算法且不加盐,便于直接比较。
数据管道校验和
为数据集和文件导出添加校验和,以便下游消费者可以验证他们收到的是完整、未经修改的数据。对内容字符串计算哈希,将哈希与数据一起存储,并在接收端重新验证。这种模式可检测存储、网络传输和处理管道中的静默数据损坏。
基于内容的缓存键
内容寻址存储系统(如 git 对象、npm 包验证和 CDN 缓存键)使用哈希作为标识符。内容的哈希就是键——相同的内容始终具有相同的哈希,任何改动都会产生不同的哈希。对于任何改动都应失效的内容,使用 SHA-256 哈希作为缓存键。
API 请求签名与 HMAC 验证
许多 API(Stripe、GitHub、Twilio)使用 HMAC-SHA256 对 webhook 载荷进行签名,以便接收方可以验证请求确实来自 API 提供商。理解哈希函数是实现 webhook 签名验证的前提:你用共享密钥对原始请求体进行哈希,并将其与头部中的签名进行比较。我们的工具让你将载荷的 SHA 哈希作为学习练习来探索;生产环境中的 HMAC 应使用加密库而非此 UI 工具。
理解 Git 对象标识
Git 通过 SHA-1 哈希来标识每个提交、树、blob 和标签。提交哈希是确定性的——相同的仓库状态始终产生相同的提交哈希。更改任何内容、消息、父提交或时间戳都会产生完全不同的哈希。理解 git 哈希的工作原理可以揭开 rebase(它会更改哈希)、cherry-pick 和内容寻址存储的神秘面纱。在此对"Hello, World!"计算哈希,观察 git 会为该 blob 存储的相同十六进制输出。
示例
对测试密码计算哈希
生成已知输入的 SHA-256,以便与存储的哈希值比较。
myTestPassword SHA-256: a1b2c3...(确定性的 64 字符十六进制字符串——相同的输入始终产生相同的输出) 观察雪崩效应
对"Hello"和"hello"计算哈希,看看单个字符的改动如何产生完全不同的哈希。
输入 A: Hello
输入 B: hello SHA-256 A: 185f8db32921bd46d35cc2e50...
SHA-256 B: 2cf24dba5fb0a30e26e83b2ac...(尽管只差一个字符却完全不同) 文件内容指纹
生成文件内容的 SHA-256 哈希,用作缓存键或完整性检查。
以文本形式粘贴的 CSS 文件内容 SHA-256: 8d969eef6ecad3c29a3a629280...(唯一指纹——任何 CSS 字符改变都会随之变化) 哈希生成器 对比 MD5
SHA-256 与 MD5 对比——两者都是哈希函数,但安全特性截然不同。
| 功能 | Toolorah | MD5 |
|---|---|---|
| 输出大小 | SHA-256:256 位(64 个十六进制字符) | 128 位(32 个十六进制字符) |
| 抗碰撞性 | 强——无已知碰撞 | 已攻破——已演示实际碰撞 |
| 抗原像性 | 强 | 理论上已削弱 |
| 速度(CPU 哈希) | 中等 | 非常快 |
| 适合用于安全 | 是——TLS、代码签名、密码 | 否——仅限非安全校验和 |
| 在 git 中使用 | 历史上为 SHA-1;现代 git 中为 SHA-256 | 从不 |
| NIST 推荐 | 是 | 否——已弃用 |
哈希生成器 使用技巧
- SHA-1 在安全用途上已被攻破——仅将其用于非安全的校验和和旧系统兼容。
- SHA-256 是当前的安全标准:数字签名、证书、PBKDF2 密码哈希。
- 哈希不是加密——你无法从哈希值还原出原始文本。可恢复的数据请使用加密(AES)。
- 雪崩效应意味着即使单个字符的改动也会产生完全不同的哈希——这是核心安全属性。
- 密码存储请使用 bcrypt、scrypt 或 Argon2,它们会增加计算成本并加盐。原始 SHA 哈希不适合用于密码。
常见问题解答
SHA-1、SHA-256 和 SHA-512 有什么区别?
SHA-1 产生 160 位(40 个十六进制字符)的哈希。它在 2010 年代初之前一直是安全标准,但如今被认为在密码学上脆弱——2017 年已演示了实际的碰撞攻击。请勿将其用于安全应用。SHA-256 产生 256 位(64 个十六进制字符)的哈希,属于 SHA-2 系列。它是 TLS 证书、代码签名、加密货币和大多数安全应用的当前标准。SHA-512 产生 512 位(128 个十六进制字符)的哈希,同样属于 SHA-2。它在 64 位处理器上比 SHA-256 更快,并提供更大的安全余量。
我能逆向哈希以获取原始文本吗?
不能。密码学哈希函数被设计为单向的——不存在数学逆运算。"破解"哈希的唯一方法是穷举搜索:不断尝试输入,直到某个输入产生相同的哈希。对于短的或常见的输入(短密码、字典词),预先计算的彩虹表使这一过程很快。对于长的随机输入,以当前或可预见的硬件来说在计算上不可行。这就是为什么哈希适合用于密码存储——即使数据库被盗,也无法从哈希中还原出密码(前提是正确加盐)。
什么是哈希碰撞?
当两个不同的输入产生相同的哈希时,就发生了碰撞。由于哈希函数将无限的输入映射到有限的输出空间,碰撞在理论上必然存在。其安全属性是抗碰撞性——使得在计算上无法找到任意两个具有相同哈希的输入。SHA-1 的抗碰撞性已被攻破。SHA-256 和 SHA-512 目前被认为是抗碰撞的。尚未发现 SHA-256 的碰撞;据估计,找到它所需的计算资源会超过当今全世界的计算能力。
什么是雪崩效应?
雪崩效应是指输入的微小变化会产生截然不同输出的属性。在 SHA-256 中,更改输入中的单个字符会改变全部 256 个输出位中约一半。这是一种刻意设计的安全属性——它防止相似输入之间的任何关联在其哈希中显现,否则就会泄露关于输入的信息。你可以直接观察到这一点:对"Hello"和"hello"计算哈希,并比较尽管只差一个字符却完全不同的输出。
为什么哈希函数不用于加密?
哈希函数在设计上是单向的——你无法解密哈希来还原原始数据。加密是双向的:用密钥加密的数据可以用相同或相关的密钥解密。它们解决不同的问题:哈希用于证明数据完整性和安全地存储密码(通过重新计算哈希并比较来验证,而非解密)。加密提供机密性(数据本身必须可恢复)。把哈希用于以后需要取回的数据是一种架构错误——应改用 AES 加密。
破解一个 SHA-256 哈希需要多长时间?
答案完全取决于输入的熵。一个 6 字符的小写密码(3.08 亿种可能)在现代硬件上对 SHA-256 进行暴力破解只需几秒。一个字典词加一个数字需要几分钟。一个随机的 16 字符密码(来自我们的密码生成器)的可能输入比可观测宇宙中的原子还多——暴力破解实际上不可能。这就是为什么密码哈希应使用 bcrypt、Argon2 或 PBKDF2——这些函数被刻意设计得很慢,使得即使对相对较短的密码,暴力破解也需要数千年。
什么是 HMAC,它与普通的 SHA 哈希有何不同?
HMAC(基于哈希的消息认证码)将哈希函数与密钥结合,以产生消息认证码。普通 SHA 哈希:hash(消息)——任何人都能计算。HMAC:hash(密钥 + 消息)——只有持有密钥的各方才能计算或验证。HMAC-SHA256 用于验证 webhook 的真实性(Stripe、GitHub)、对 API 请求签名(AWS Signature Version 4)以及对会话令牌中的数据进行认证。密钥可防止攻击者伪造有效的 HMAC,即使他能看到所有消息及其 MAC 也无济于事。