哈希文本(加密)

具有 SHA、HMAC、十六进制或 Base64 输出的哈希文本以及哈希比较。

免费在线哈希和 HMAC 生成器

加密哈希可验证数据完整性、签署 Webhook 并比较秘密,而无需存储明文。 Dokall 支持具有十六进制或 Base64 输出的 SHA-1、SHA-256、SHA-384、SHA-512 和 HMAC。

粘贴文本,选择算法,然后复制哈希值。使用比较功能来验证两个哈希匹配 - 对于调试身份验证和校验和工作流程至关重要。

什么是哈希?

哈希函数接受任意大小的输入,并产生固定大小的输出(哈希、摘要或校验和)。相同输入总是产生相同哈希。输入哪怕有微小变化,也会产生完全不同的哈希——这称为雪崩效应。

密码学哈希函数还有额外性质:从哈希反推原始输入在计算上应不可行(原像抗性);找到两个不同输入产生相同哈希应不可行(抗碰撞);找到与给定输入哈希相同的另一输入应不可行(第二原像抗性)。这些性质使哈希对安全、数据完整性和身份验证至关重要。

哈希算法对比

MD5 产生 128 位(32 字符十六进制)哈希。速度快,但在安全用途上已被攻破——可在数秒内生成碰撞。仍可用于非安全校验和(文件完整性、缓存键),但绝不能用于密码或数字签名。

SHA-1 产生 160 位(40 字符十六进制)哈希。同样已被攻破——自 2017 年起存在实用碰撞攻击。已被浏览器、证书颁发机构和 git(正迁移到 SHA-256)弃用。新应用应避免使用。

SHA-256 产生 256 位(64 字符十六进制)哈希,属于 SHA-2 家族。目前被认为安全,尚无已知实用攻击。用于 TLS 证书、比特币、数字签名及多数安全应用。是通用哈希的默认选择。

SHA-512 产生 512 位(128 字符十六进制)哈希,同属 SHA-2。在 64 位系统上因以 64 位字运算而比 SHA-256 更快,并提供更大安全裕度。在需要最大哈希长度或安全裕度时使用。

SHA-3(Keccak)是与 SHA-2 不同的算法家族,作为 SHA-2 万一被攻破时的备份而标准化。安全,但软件实现比 SHA-2 慢。用于部分区块链协议,以及需要算法多样性时作为替代。

哈希与加密

哈希是单向的:无法从哈希恢复原始数据。加密是双向的:有正确密钥即可将密文解密回原始明文。

需要在不存储或恢复原文的情况下验证数据时,使用哈希。密码验证是经典例子——存储哈希,用户登录时对其输入做哈希并比较。文件完整性检查也是——对文件做哈希、分享哈希,接收方即可验证文件未被篡改。

需要保护数据并稍后取回时,使用加密。含个人数据的数据库字段、传输中的文件和通信通道需要加密,而非哈希。

常见错误是用加密存密码。若加密密钥泄露,所有密码都会暴露。使用正确的密码哈希(bcrypt、Argon2)时,即使数据库完全泄露,也不会直接暴露密码。

HMAC:基于哈希的消息认证

HMAC(基于哈希的消息认证码)将哈希函数与密钥结合,产生认证码。普通哈希验证完整性(数据未被更改),HMAC 同时验证完整性和真实性(数据来自知道密钥的人)。

HMAC 算法如下:HMAC(key, message) = Hash((key XOR opad) || Hash((key XOR ipad) || message))。实践中,你只需用密钥、消息和哈希算法调用语言自带的 HMAC 函数。

常见用途:API 请求签名(服务器验证请求来自授权客户端)、webhook 验证(GitHub、Stripe 和 Slack 用 HMAC-SHA256 签名 webhook 载荷以便你验证真实性)、JWT 签名(HS256 即 HMAC-SHA256),以及 cookie 签名(框架对会话 cookie 签名以防止篡改)。

正确哈希密码

切勿用 SHA-256、SHA-512 或 MD5 哈希密码。这些算法设计为快速——现代 GPU 每秒可计算数十亿次 SHA-256 哈希,使暴力破解变得轻而易举。

使用专为密码哈希设计的算法:bcrypt、scrypt 或 Argon2id。它们故意缓慢(可配置工作因子)且内存困难(抗 GPU 加速)。Argon2id 是 OWASP 当前推荐,也是密码哈希竞赛的获胜者。

每个密码务必使用唯一随机盐。盐在哈希前与密码结合,确保相同密码产生不同哈希。不加盐时,攻击者可用预计算彩虹表一次破解整个数据库。bcrypt 和 Argon2 会自动处理加盐。

推荐参数(2024):bcrypt 成本因子 12+;Argon2id 取 m=19456 KB、t=2、p=1;或 scrypt 取 N=2^15、r=8、p=1。调整参数使哈希在服务器上耗时 100–500ms——足以抵抗暴力破解,又不明显影响用户体验。

哈希的常见用途

数据完整性验证:下载文件后,将其 SHA-256 哈希与公布的哈希比对,确认传输过程中未被损坏或篡改。包管理器(npm、pip)以此验证包完整性。

基于内容的寻址:Git 使用 SHA-1(正迁移到 SHA-256)通过内容哈希标识每个提交、树和 blob。IPFS 使用 multihash 做内容寻址。Docker 镜像层由其内容摘要标识。

去重:对文件内容哈希并比较哈希,无需比较整个文件即可发现重复。备份系统和云存储用此避免重复存储相同数据。

缓存键:对请求参数哈希以生成缓存键。相同参数产生相同哈希时,返回缓存响应而非重新计算。

数字签名:先对文档哈希,再用私钥对哈希签名。这比签署整个文档更快,且无论文档大小都产生固定大小的签名。

常见问题

哈希可以逆转吗?
不可以。密码学哈希函数设计为单向。无法通过数学运算从哈希恢复原始输入。但对短或常见输入(如简单密码),攻击者可用预计算表(彩虹表)或暴力破解找到产生相同哈希的输入。这正是密码哈希使用盐和慢速算法的原因。
为什么 MD5 不再被视为安全?
MD5 存在已知碰撞漏洞——研究人员可在数秒内生成两个具有相同 MD5 哈希的不同文件。这会破坏数字签名、证书验证,以及任何依赖抗碰撞性的安全应用。MD5 仍可用于缓存键和文件去重等非安全用途,但绝不能用于密码、签名,或对抗性场景下的完整性验证。
哈希与加密有什么区别?
哈希是单向的——无法从哈希恢复原始数据,用于验证(密码、文件完整性)。加密是双向的——有正确密钥即可解密回原始数据,用于保密(保护传输中和静态的数据)。密码用哈希,需要稍后读取的数据用加密。
什么是 HMAC?何时使用?
HMAC(基于哈希的消息认证码)是结合密钥的哈希。它同时验证数据完整性和真实性。当你需要确认消息来自可信来源且未被篡改时使用 HMAC——API 请求签名、webhook 验证、JWT 签名(HS256)和 cookie 签名是常见用例。
什么是哈希碰撞?
碰撞是指两个不同输入产生相同哈希输出。由于哈希输出大小固定,碰撞在理论上必然存在(鸽巢原理)。对安全的哈希函数,找到碰撞在计算上应不可行。当发现实用碰撞攻击时(如 MD5 和 SHA-1),该算法在安全用途上即被视为已被攻破。
我应该使用哪种哈希算法?
通用哈希(文件校验和、数据完整性、缓存键):SHA-256。密码哈希:Argon2id、bcrypt 或 scrypt——切勿用 SHA-256 或 MD5。HMAC:SHA-256(HMAC-SHA256)。最大安全裕度:SHA-512 或 SHA-3。注重速度的非安全校验和:xxHash 或 CRC32。
如何在应用中哈希密码?
使用专用密码哈希库:bcrypt(多数语言可用)、Argon2id(OWASP 推荐)或 scrypt。这些库会自动处理加盐。切勿对密码使用原始 SHA-256/SHA-512——它们太快,无法抵抗暴力破解。Node.js 示例:const hash = await bcrypt.hash(password, 12)。验证:const match = await bcrypt.compare(input, hash)。
密码哈希中的盐是什么?
盐是在哈希前加到密码上的随机值。每个密码有唯一盐,与哈希一并存储。加盐确保相同密码产生不同哈希,防止彩虹表攻击,并使人无法识别使用相同密码的用户。bcrypt 和 Argon2 会自动生成并包含盐。