关于哈希生成器
这款免费的哈希生成器可以计算任意文本的 MD5、SHA-1、SHA-256、SHA-384 和 SHA-512 哈希值,一次全部算出,并随您的输入实时更新。
哈希值使用 Web Crypto API 在您的浏览器中计算 — 您的文本绝不会被上传。
什么是哈希
哈希函数接受任意长度的输入,生成一个固定长度的指纹。无论输入一个字符还是一整本书,SHA-256 都会返回 64 个十六进制字符。
三个特性让它变得有用:
确定性。 相同的输入永远产生相同的哈希值。任何时候、任何机器上、永远如此。
雪崩效应。 改动输入中的一个比特,输出中大约一半的比特就会翻转。hello 和 hellp 的哈希值之间看不出任何关联。不存在"接近"这回事 — 哈希要么完全相同,要么什么也说明不了。
单向性。 您无法从哈希值反推出输入。该函数是有意丢弃信息的,并不存在逆运算。
最后这一点正是关键所在,也是哈希不等于加密的原因。
哈希不是加密
加密是双向的:有了密钥就能取回原文。这正是它的全部目的。
哈希在设计上就是单向的。没有密钥,也没有回头路。一份 500 页的文档和一个字母都会变成 64 个字符 — 绝大部分信息就此消失了。
所以哈希回答的问题从来不是"这原本是什么?",而是"这个和那个是否相同?"。比较两个哈希值:相同意味着输入相同;不同意味着输入不同。
由此产生了一个常见误解。"解密"MD5 哈希这件事并不存在。那些查询网站真正做的,是预先把数十亿个常见输入算好哈希,再看看您的值是否在表里。他们不是在逆转函数,而是在辨认一个见过的值。凡是不常见的内容,表里都没有。
MD5 和 SHA-1 已被攻破 — 这意味着什么
两者依然随处可见,而两者用于安全目的都不安全。值得弄清楚具体是怎么回事。
碰撞指两个不同的输入产生相同的哈希值。这本该是做不到的。但对 MD5 而言如今轻而易举 — 在一台普通电脑上几秒钟就能造出碰撞。SHA-1 于 2017 年失守,谷歌演示了两个具有相同 SHA-1 哈希值的不同 PDF,此后这种攻击的成本只降不升。
这为何重要:如果有人能构造出哈希值相同的两个文件,哈希就不再能证明某个文件正是您期待的那一个。一份已签名的文档可能被换成另一份指纹相同的文档。
MD5 仍然够用的场合: 检测意外损坏。想知道下载是否完整到达,或磁盘上两个文件是否重复,MD5 可以胜任而且很快。随机损坏不会产生碰撞。
不够用的场合: 任何可能有人试图欺骗您的情形 — 验证下载内容的真实性、签名,或存储密码。
凡是要紧的事都请使用 SHA-256。它没有已知的实用碰撞攻击,速度快,而且是现代系统中的默认选择。对大多数用途而言,SHA-512 并没有明显更安全,不过在 64 位硬件上可能更快。
切勿用普通哈希存储密码
这是哈希函数最严重的误用,并且确实造成了真实的数据泄露。
用 SHA-256 对密码做哈希并保存结果是不够的。问题就出在快速哈希上:SHA-256 的设计目标是快,现代硬件每秒能计算数十亿次。窃取了您数据库的攻击者,只需逐一尝试可能的密码,直到哈希值对上为止。
另有两个问题让情况更糟。相同的密码产生相同的哈希值,攻击者一眼就能看出哪些账户用了同一个密码。而预先计算好的彩虹表意味着常见密码根本不用费力就能被识别出来。
正确的做法是使用专为缓慢且耗内存而设计的密码哈希函数:bcrypt、scrypt 或 Argon2。它们为每个密码添加唯一的随机盐值,使相同的密码也会得到不同的哈希;并且刻意设计得开销很大 — 调校到一次校验需要肉眼可感的零点几秒,从而使数十亿次猜测变得不切实际。
请使用成熟的库。 密码存储不是该用哈希原语自行拼装的东西。
哈希真正的用武之地
- 校验下载 — 把公布的校验和与收到的文件作比较
- 查找重复文件 — 哈希相同即内容相同
- 变更检测 — 这个文件、记录或配置有没有被改动过?
- 内容寻址 — Git 以哈希值命名每一次提交和每一个对象
- 数据完整性 — 确认一次传输或备份没有损坏地到达
- 缓存键 — 从较长内容派生出的简短稳定标识
- 数字签名 — 先对文档做哈希,再对哈希值签名
使用方法
- 输入或粘贴您的文本
- 各个算法的哈希值会实时更新
- 用复制按钮复制任意哈希值
值得注意
- 输出长度是固定的。 MD5 给出 32 个十六进制字符,SHA-1 给出 40 个,SHA-256 给出 64 个,SHA-512 给出 128 个 — 与输入大小无关。
- 一切细节都算数。 末尾的一个空格、文件结尾的换行,或者不同的换行符,都会彻底改变哈希值。这正是校验和"本该"吻合却不吻合的常见原因。
- 编码很重要。 本工具按 UTF-8 对您的文本做哈希。用另一种编码对同样的字符做哈希,结果会不同。
- 大小写是惯例,不是含义。 哈希值常以大写或小写呈现,取值是一样的。比较时请忽略大小写。
- 空输入同样有哈希值 — 每种算法都有一个众所周知的常量。
- 对大文件做哈希最好使用操作系统自带的工具:Windows 上用 certutil -hashfile,macOS 和 Linux 上用 shasum -a 256。
常见问题
哈希和加密有什么区别?
加密是可逆的 — 有了正确的密钥就能还原原始数据,这正是它的意义所在。哈希在设计上是单向的:它生成固定长度的指纹,并且没有回头路,因为大部分信息被有意丢弃了。哈希回答的是"这两样东西是否相同?",从来不是"这原本是什么?"。
哈希值能被解密或还原吗?
不能。那些查询网站提供的不是还原而是辨认:他们已把数十亿个常见字符串预先算好哈希,然后看您的值是否出现在表中。常见密码和词典单词会被立刻找到;不常见的内容不在表里,也永远不会在。函数本身是无法求逆的。
MD5 现在还能安全使用吗?
只能用于检测意外损坏,比如确认下载是否完整到达,或查找重复文件。面对蓄意攻击它已被彻底攻破 — 具有相同 MD5 的两个不同文件几秒钟就能造出来。SHA-1 同样已被攻破,2017 年以相互碰撞的 PDF 得到验证。凡是涉及信任的场合,请使用 SHA-256。
我该使用哪种哈希算法?
几乎所有情况都用 SHA-256。它速度快、支持广泛,且没有已知的实用碰撞攻击。SHA-512 是合理的替代,在 64 位系统上可能更快,但实际上并没有明显更安全。MD5 和 SHA-1 请留给与既有系统的兼容,以及与安全无关的校验。
我可以用它来给网站的密码做哈希吗?
请不要。SHA-256 这类快速哈希是选错了工具:硬件每秒可计算数十亿次,被窃取的数据库很快就会被暴力破解。请使用 bcrypt、scrypt 或 Argon2,它们为每个密码添加唯一盐值,并且刻意设计得很慢。永远使用成熟的库,而不要自己拼装密码存储方案。
为什么我算出的哈希与网站上公布的不一致?
几乎总是因为输入中存在看不见的差异。末尾的空格、结尾缺少或多出的换行,或者用了 Windows 换行符而非 Unix 换行符,都会彻底改变哈希值 — 这正是雪崩效应在正常发挥作用。另外请确认您比较的是同一种算法,因为页面上可能列出好几种。
我的文本会被发送到服务器吗?
不会。SHA 系列哈希由您浏览器内置的 Web Crypto 实现计算,MD5 由 JavaScript 计算,二者都完全在您的设备上完成。没有任何内容被传输或存储,即使断开网络本工具也照样可用。
相关工具
- 文件校验和 — 对真实文件而非粘贴的文本做哈希
- 密码生成器 — 生成值得妥善保存的强密码
- Base64 编码 / 解码 — 与哈希不同,编码是可逆的
- JWT 解码器 — 其签名正是构建在这些哈希函数之上的令牌