哈希比对
用常量时间比较两个哈希值是否一致:自动识别 MD5 / SHA-1 / SHA-256 / SHA-384 / SHA-512 的十六进制或 base64 写法,可忽略大小写与 `sha256:` 前缀,并支持多对多批量比对、逐行给出匹配结果与差异原因。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
比对选项
比对使用自研的常量时间算法:异或累积差异,长度不同也会把较长的一侧扫完,不会因为「第几位开始不同」泄漏耗时。整个过程在浏览器本地完成,不会上传任何值。
比对结果
粘贴两个哈希值后点击「比对」。
JS 引擎无法给出严格的时间保证,这里只是尽力而为;真正的密钥比较请在服务端用原生实现。
这个工具能做什么
- 从官网下载的安装包旁边通常写着 SHA-256 校验和,把官网值和本地算出的值各粘贴一次,就能确认文件有没有被中间人替换或下载损坏。
- 核对数据库里存的摘要和用户提交的摘要是否一致时,直接看字符串容易漏掉大小写、冒号分隔、`sha256:` 前缀这类差异,工具会先归一化再判断。
- 批量核对:一次粘贴几十行「期望值 实际值」,逐行给出匹配 / 不匹配与原因,比一行行肉眼比对快得多。
- 写测试或排查问题时,用来确认两个摘要是否真的相同——长度不同会被直接点出来,避免把「被截断的哈希」当成匹配。
示例
输入
哈希 A:2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae 哈希 B:sha256:2C26B46B68FFC68FF99B453C1D30413413422D706483BFA0F98A5E886266E7AE
输出
匹配;两侧均识别为 SHA-256(256 位、64 个十六进制字符),比较字符数 64,输入提示「已忽略算法前缀」
这是 SHA-256("foo") 的值:右侧只是加了 `sha256:` 前缀并全部大写,归一化后与左侧完全一致。
常见问题
为什么长度不同的哈希也要比完?直接返回「不相等」不行吗?
因为返回值之外的时间也会泄漏信息:如果长度不同就立刻返回,攻击者能通过响应时间判断「输入长度是否猜对」。这里按较长的一侧扫完全程,短的补 0,用异或累积差异,最后只看累积值是否为零。
这个比较真的「常量时间」吗?
算法层面是常量时间的(固定循环次数、无提前返回),但 JavaScript 引擎的 JIT 与垃圾回收无法给出严格的时间保证,所以只能算尽力而为。真正的密钥、口令摘要比对请放在服务端用原生实现,并且优先使用带随机盐与慢哈希的方案。
base64 和十六进制都能识别吗?
能。十六进制按字符数识别(MD5 32、SHA-1 40、SHA-256 64、SHA-384 96、SHA-512 128),base64(含 base64url 的 `-`、`_`)按解码后的字节数识别(16 / 20 / 32 / 48 / 64 字节)。长度对不上任何已知摘要时会给出提示,但仍然照常比较。
大小写、冒号分隔、`sha256:` 前缀会影响结果吗?
默认不会:工具会先去掉算法前缀、`0x`、引号,以及十六进制里的空格、冒号、连字符,并把十六进制转成小写。注意 base64 是大小写敏感的,不会被小写化。需要严格区分大小写时,把「忽略十六进制大小写」关掉即可。
粘贴的值会上传吗?会不会被记录?
不会。比较完全在浏览器里用字符串运算完成,页面不发起任何网络请求,也没有服务端存储。刷新页面后输入即被清空。
关键词:hash comparehash checkchecksum compareconstant time comparesha256 comparemd5 compare哈希比对哈希校验摘要比对校验和比对常量时间比较SHA-256 校验