生成哈希值
为文本或任意大小的文件计算MD5、SHA-1、SHA-256、SHA-384和SHA-512,可用于核对下载文件是否与公布的校验值一致。不存储任何内容。
- 绝不存储
- 无需排队,无需等待
- 无需注册,无水印
文本按UTF-8计算哈希。如需校验下载的文件,请拖入文件。
使用方法
粘贴文本或拖入文件
文本按UTF-8计算哈希值。文件在这里读取并计算,绝不会被存储。
一次查看所有哈希值
五种算法同时计算,您不必事先知道需要哪一种。
与预期值比对
粘贴您拿到的校验值,系统会自动为您比对——用肉眼逐个字符比较,正是最容易出错的地方。
哈希值能证明什么,不能证明什么
哈希值是任意数量数据的定长指纹,它有两个值得准确说明的特性。它是单向的——没有任何运算能把哈希值还原成数据,因为几乎所有信息都已丢失。它也是敏感的:输入改动一个比特,输出大约有一半的比特都会改变。正因如此,它可以用来确认下载的文件是否完整,或者无需逐字节比较就判断两个文件是否相同。
MD5和SHA-1已被攻破,但出于某个原因仍然保留在这里。两者都存在实用的碰撞攻击——MD5自2004年起,SHA-1于2017年用一对真实的PDF得到证实——这意味着有人可以构造出两个哈希值相同的不同文件。所以面对蓄意攻击者,两者都证明不了任何东西。但它们仍然能很好地发现意外损坏,而且大量实际软件仍在发布MD5校验值,所以用它核对下载文件是正当的需求。凡是可能有人试图欺骗您的场景,请使用SHA-256。
绝不要用这里的任何一种算法对密码做哈希。这是本页面上后果最严重的一点。哈希函数的设计目标就是快,而快恰恰不适合密码:一块现代显卡每秒能计算数十亿次SHA-256,所以一个被盗的哈希密码数据库几小时内就会被破解。存储密码需要有意设计得很慢、并为每个用户加盐的函数——argon2、bcrypt或scrypt——它们就是为了故意消耗时间和内存而设计的。对密码直接做SHA-256是一个漏洞,而不是保护,无论它在数据库字段里看起来多么像样。
把您算出的哈希值与下载页面上公布的哈希值对比,能证明的比看上去要少:能替换文件的人,同样能替换旁边的数字。校验值最有价值的时候,是它来自别处——已签名的发布版本、另一个独立渠道,或您自己早先记录下来的值。
如果您需要的是别的
在命令行中这只需一个命令:macOS和Linux上用shasum -a 256 file,Windows上用certutil -hashfile file SHA256,需要核对旧式校验值时用md5sum或sha1sum。它们以流式读取文件而不是整个载入,所以没有大小限制——对于几百MB以上的文件,这才是真正的区别,因为把整个文件放在内存中的网页会直接失败。
要验证一个发布版本是真实的,而不仅仅是完整的,单靠哈希值并不合适。GPG签名——gpg --verify file.sig file——能证明文件是谁制作的,而这是校验值无法回答的问题。大多数正规项目两者都会发布,真正重要的是签名。
常见问题
我的文件会被存储吗?
不会。文件使用与HTTPS相同的浏览器内置密码学功能计算哈希值。不存储任何内容,所以没有大小上限,也不必等待网络连接。
有大小限制吗?
取决于可用内存,而不是固定的大小上限。浏览器的密码学功能无法分块计算文件哈希——它需要一次把整个文件放进内存——所以在内存装不下的电脑上,超大文件(比如DVD镜像)可能会失败。在普通电脑上,几百MB以内的文件都没问题。如果大文件失败了,那就是您碰到了这个限制,页面会直接告诉您,而不会卡住不动。
应该用哪种哈希算法?
新用途一律用SHA-256。它是现代的默认选择,软件校验值、容器摘要和区块链系统都在使用它,而且没有已知的弱点。只有在其他系统要求时才用MD5或SHA-1——核对旧的已发布校验值、遗留系统,或者Git(它用SHA-1标识对象)。当您确实需要更长的摘要时用SHA-512;在64位电脑上,它往往比SHA-256更快,而不是更慢。
可以用它对密码做哈希吗?
可以算,但不应该存储结果。这是该领域最常见的错误,所以值得直说:MD5、SHA-1和SHA-256都不适合用于密码,SHA-256在密码学上很强也无济于事。问题在于这些函数按设计就是“快”的——一块现代显卡每秒能计算数十亿次SHA-256,所以一个被盗的SHA-256密码哈希数据库会以惊人的速度被破解。密码需要专门为此设计、有意放慢且加盐的函数:bcrypt、scrypt或Argon2。每个正规框架都内置了其中一种。
为什么MD5被标记为已攻破?
因为如今任何人都能在普通硬件上,几秒内构造出两个MD5哈希值相同的不同文件。自2004年起就是如此,而且已经在现实中造成过实际后果——两份显示不同合同的PDF,两个可执行文件中有一个是恶意软件。所以MD5无法证明文件就是您预期的那个文件;蓄意伪造的文件也能匹配。用它来发现意外损坏(例如下载出错或复制不完整)仍然完全合理,而大多数公布的MD5校验值实际上也正是为此。但它绝不能用于安全用途。
为什么SHA-1被标记为已攻破?
原因相同,只是时间更近。2017年,Google和CWI制作出两个SHA-1哈希值相同的不同PDF;到2020年,这种攻击的成本已经低到足以伪造签名。浏览器多年前就已不再接受SHA-1证书,Git也正在迁移离开它。如果您今天要选择算法,请选SHA-256。
如何校验下载的文件?
拖入下载的文件,然后把您下载来源网站上的校验值粘贴到比对框中。如果一致,说明文件完整无损,并且就是所发布的那个文件。如果不一致,请删除它并重新下载。有两点需要注意:请从官方来源获取校验值,而不是从您下载文件的地方获取;并且记住,校验值只能证明文件与那个页面所公布的内容一致——如果页面本身已被篡改,两者照样会一致。
哈希值计算得准确吗?
SHA-1、SHA-256、SHA-384和SHA-512来自浏览器自带的Web Crypto实现,与处理HTTPS的是同一套代码。Web Crypto中没有MD5——这是有意为之,因为它已被攻破——所以这里直接依据RFC 1321实现了MD5,并用该文档自己公布的测试向量进行了核对。
小贴士: 提供MD5和SHA-1,是因为现实中的文件和旧系统仍在使用它们,而不是因为它们安全——两者在任何安全相关用途上都已被攻破,只适合用作校验值。Web Crypto不支持增量计算摘要,所以整个文件都要放在内存中:超大文件会直接失败,而不会流式处理。
把这个工具放到您的网站上
博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。