MD5 哈希生成器

计算文本、十六进制字节或文件的 128 位 MD5 摘要。结果随输入实时更新,在“对比”框中粘贴预期的校验值,即可知道两者是否一致。

全部算法

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 输入或粘贴文本,也可以切换为十六进制字节输入,或打开文件直接计算其原始字节的哈希。
  2. 除非原哈希是用其他字符集的文本算出的,否则“文本编码”保持 UTF-8 即可。
  3. 在“输出格式”中选择小写十六进制、大写十六进制或 Base64。
  4. 校验下载的文件时,把官方公布的 MD5 粘贴到“对比”框,显示“一致”即表示文件相同。

什么是 MD5?

MD5(Message-Digest Algorithm 5)由 Ronald Rivest 设计,1992 年以 RFC 1321 发布。它以 512 位为一块读取输入,输出 128 位摘要,通常写成 32 个十六进制字符或 24 个 Base64 字符。相同的输入永远得到相同的摘要,而输入哪怕只改动一位,输出也会有大约一半的位随之改变。

哈希是单向的:它没有密钥,也无法把 MD5 值“解密”回原文。号称能破解 MD5 的网站,其实只是在海量的常用词和泄露密码的哈希表里查找,所以未加盐的短密码,其 MD5 往往几秒钟就能被查出来。

MD5 现在还安全吗?

面对攻击者时并不安全。2004 年,王小云等人公布了实用的碰撞攻击,即两段不同的输入得到相同的 MD5。随后出现的选择前缀碰撞更进一步:2008 年研究人员借此伪造出一张可用的 CA 证书,2012 年 Flame 恶意软件又用它伪造了一张证书,让自己的代码看起来像是由微软签名的。如今用普通笔记本电脑几秒钟就能构造出一对 MD5 碰撞,RFC 6151 也明确指出,在需要抗碰撞性的场合(例如数字签名),MD5 已不再适用。

不过,用 MD5 检测意外损坏仍然可行,比如下载不完整或磁盘上某一位出错,也可以用作缓存键,或对可信数据去重。如果文件或其校验值可能来自攻击者,请改用 SHA-256。

十六进制、Base64 与结果不一致的原因

MD5 通常以十六进制表示,md5sum 输出的就是这种形式。有些协议则把 16 个原始字节编码成 Base64 传输,例如 Amazon S3 等云存储 API 使用的 HTTP Content-MD5 头。选择 Base64 输出即可,已有的十六进制值也可以用十六进制转 Base64 转换。

如果你算出的 MD5 和其他工具不同,说明参与计算的字节不同。常见原因是末尾多了换行符、使用了 Windows 换行符,或者文本编码不同:“café”在 UTF-8 下是 5 个字节,在 ISO-8859-1 下只有 4 个字节,两者的 MD5 毫无相似之处。

$ echo "hello" | md5sum      # 实际哈希的是 "hello\n"
b1946ac92492d2347c6235b4d2611184  -
$ printf 'hello' | md5sum    # 只哈希 "hello"
5d41402abc4b2a76b9719d911017c592  -

在命令行和代码中计算 MD5

md5sum file.iso                          # Linux
md5 file.iso                             # macOS
certutil -hashfile file.iso MD5          # Windows
Get-FileHash file.iso -Algorithm MD5     # PowerShell

# Python
import hashlib
hashlib.md5('hello'.encode('utf-8')).hexdigest()

// Node.js
require('crypto').createHash('md5').update('hello', 'utf8').digest('hex')

浏览器内置的 Web Crypto API 不提供 MD5,因此本页在你的设备上用 JavaScript 计算 MD5,不会上传任何内容。结果下方的“全部算法”表格还会列出同一输入的 SHA-1、SHA-256、SHA-384、SHA-512、CRC-32 和 CRC-32C。

编码示例

输入 (UTF-8)MD5
Hello, World!65a8e27d8879283831b664bd8b7f0ad4
Base64.is2e3c0e8b828164a8db7f62146ca87e14
你好7eca689f0d3389d9dea66ae112e5cfd7

常见问题

MD5 可以解密吗?
不能。MD5 是单向哈希函数,不是加密算法,因此不存在“解密”;所谓的 MD5 解密网站只能返回其表中早已收录的输入。如果以后还需要取回原始数据,应当使用加密;如果数据无需保密,也可以用 Base64 编码,它可以完整还原。
用 MD5 校验下载文件够用吗?

MD5 能可靠地发现意外损坏。但由于构造碰撞的成本很低,事先准备好文件的人可以再做出一个内容不同、MD5 却相同的文件。涉及安全的下载,请使用从可信来源获得的 SHA-256 校验值或数字签名。

MD5 值有多长?
128 位,即 16 字节:十六进制为 32 个字符,Base64 为 24 个字符,并以 == 结尾。32 个字符的十六进制字符串也可能是 MD4 或 NTLM 哈希,可以用哈希识别工具列出可能的算法。
可以计算大文件的 MD5 吗?
可以。打开文件后,浏览器会在本地读取并计算其字节的哈希,不会上传。上限取决于浏览器可用的内存,几 GB 的超大文件更适合用 md5sum 或 certutil 计算。
可以用 MD5 存储密码吗?
不可以。MD5 的设计目标就是快,一块 GPU 每秒就能尝试数十亿次猜测。存储密码应使用 Argon2id、scrypt、bcrypt 或 PBKDF2,它们会加盐并刻意放慢计算。需要新密码时,可以先用密码生成器生成高强度密码。