免费在线哈希和 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 镜像层由其内容摘要标识。
去重:对文件内容哈希并比较哈希,无需比较整个文件即可发现重复。备份系统和云存储用此避免重复存储相同数据。
缓存键:对请求参数哈希以生成缓存键。相同参数产生相同哈希时,返回缓存响应而非重新计算。
数字签名:先对文档哈希,再用私钥对哈希签名。这比签署整个文档更快,且无论文档大小都产生固定大小的签名。