MD5 加密
MD5 加密工具 🔒
Section titled “MD5 加密工具 🔒”专业的 MD5 哈希计算工具,支持文本、文件 MD5 值计算,提供多种高级功能。
什么是 MD5?
Section titled “什么是 MD5?”MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,产生 128 位(16 字节)的哈希值,通常表示为 32 位十六进制数。
MD5 特点
Section titled “MD5 特点”- ✅ 固定长度 - 无论输入多长,输出都是 32 位十六进制字符串
- ✅ 单向性 - 无法从哈希值反推出原始数据
- ✅ 抗修改 - 输入微小变化,输出完全不同
- ✅ 快速计算 - 计算速度快
MD5 应用场景
Section titled “MD5 应用场景”- 🔐 密码存储 - 存储用户密码的哈希值
- 📁 文件校验 - 验证文件完整性
- 🔍 数据去重 - 快速判断数据是否相同
- 🏷️ 数字签名 - 生成数据唯一标识
文本 MD5
Section titled “文本 MD5”- 在输入框中输入文本:
Hello World- 点击「计算 MD5」按钮
- 获取结果:
b10a8db164e0754105b7a99be72e3fe5文件 MD5
Section titled “文件 MD5”- 点击「选择文件」或拖拽文件到上传区域
- 等待计算完成
- 查看文件的 MD5 值
1. 基础 MD5 计算
Section titled “1. 基础 MD5 计算”文本 MD5
Section titled “文本 MD5”// JavaScript 示例const md5 = require('md5');md5('Hello World');// 'b10a8db164e0754105b7a99be72e3fe5'文件 MD5
Section titled “文件 MD5”计算文件的 MD5 值,用于:
- 验证文件下载完整性
- 检查文件是否被篡改
- 文件去重识别
使用示例:
# Linux 命令行md5sum filename.zip
# 结果a1b2c3d4e5f6... filename.zip2. 加盐加密(Salt)
Section titled “2. 加盐加密(Salt)”为防止彩虹表攻击,在原始数据前添加随机字符串(盐值):
const salt = 'random_salt_123';const password = 'user_password';const saltedHash = md5(salt + password);// 结果与直接 md5(password) 完全不同加盐的好处:
- 相同密码产生不同哈希值
- 防止彩虹表攻击
- 提高安全性
最佳实践:
- 每个用户使用不同的盐值
- 盐值长度至少 16 位
- 盐值随机生成并安全存储
3. 多次加密(Key Stretching)
Section titled “3. 多次加密(Key Stretching)”通过多次迭代计算增加破解难度:
let hash = password;for (let i = 0; i < 1000; i++) { hash = md5(hash + salt);}常用迭代次数:
- 1000 次 - 基础安全
- 10000 次 - 推荐
- 100000 次 - 高安全
4. HMAC-MD5
Section titled “4. HMAC-MD5”使用密钥的 MD5 哈希,用于消息认证:
const crypto = require('crypto');const hmac = crypto.createHmac('md5', 'secret_key');hmac.update('message');console.log(hmac.digest('hex'));应用场景:
- API 请求签名
- 数据完整性验证
- 消息认证
5. 批量计算
Section titled “5. 批量计算”一次性计算多个文本或文件的 MD5:
- 输入多行文本(每行一个)
- 或选择多个文件
- 批量计算并导出结果
6. 对比验证
Section titled “6. 对比验证”验证两个 MD5 值是否匹配:
原始 MD5: b10a8db164e0754105b7a99be72e3fe5计算 MD5: b10a8db164e0754105b7a99be72e3fe5结果: ✅ 匹配实际应用场景
Section titled “实际应用场景”场景 1:用户密码存储
Section titled “场景 1:用户密码存储”不推荐(简单 MD5):
// 不安全!容易被彩虹表破解const hashedPassword = md5(userPassword);推荐(加盐 + 多次加密):
const crypto = require('crypto');
function hashPassword(password, salt) { let hash = crypto.createHash('md5'); hash.update(salt + password);
// 多次迭代 for (let i = 0; i < 1000; i++) { hash = crypto.createHash('md5'); hash.update(hash.digest('hex') + salt); }
return hash.digest('hex');}
// 使用const salt = crypto.randomBytes(16).toString('hex');const hashed = hashPassword('userPassword', salt);// 存储: { salt, hashed }场景 2:文件完整性校验
Section titled “场景 2:文件完整性校验”下载文件后验证 MD5:
# 下载文件wget https://example.com/file.zip
# 计算 MD5md5sum file.zip# 输出: a1b2c3d4... file.zip
# 与官方提供的 MD5 对比# 如果一致,说明文件完整场景 3:API 请求签名
Section titled “场景 3:API 请求签名”防止 API 请求被篡改:
// 客户端const params = { timestamp: Date.now(), userId: '12345', action: 'getData'};
// 按参数名排序并拼接const sortedParams = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&');
// 添加密钥并计算 MD5const sign = md5(sortedParams + '&key=secret_key');
// 发送请求params.sign = sign;fetch('/api/data', { method: 'POST', body: JSON.stringify(params)});// 服务端验证function verifySign(params, secretKey) { const receivedSign = params.sign; delete params.sign;
const sortedParams = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&'); const calculatedSign = md5(sortedParams + '&key=' + secretKey);
return receivedSign === calculatedSign;}场景 4:缓存键生成
Section titled “场景 4:缓存键生成”使用 MD5 生成缓存键:
function getCacheKey(params) { const sortedParams = Object.keys(params).sort().reduce((acc, key) => { acc[key] = params[key]; return acc; }, {});
return 'cache:' + md5(JSON.stringify(sortedParams));}
// 使用const key = getCacheKey({ userId: 123, type: 'profile' });// 相同的参数总是生成相同的 key场景 5:数据去重
Section titled “场景 5:数据去重”快速判断数据是否已存在:
const seenHashes = new Set();
function isDuplicate(data) { const hash = md5(JSON.stringify(data)); if (seenHashes.has(hash)) { return true; } seenHashes.add(hash); return false;}安全注意事项
Section titled “安全注意事项”更安全的替代方案
Section titled “更安全的替代方案”| 用途 | 不安全 | 推荐 |
|---|---|---|
| 密码存储 | MD5 | bcrypt, Argon2 |
| 文件校验 | MD5 | SHA-256, SHA-3 |
| 数据完整性 | MD5 | SHA-256, BLAKE2 |
| 数字签名 | MD5 | SHA-256 + RSA |
Q: MD5 值可以反推原文吗?
Section titled “Q: MD5 值可以反推原文吗?”A: 理论上不可以,但可以通过以下方式破解:
- 彩虹表 - 预计算的 MD5 对照表
- 暴力破解 - 尝试所有可能的组合
- 碰撞攻击 - 找到产生相同 MD5 的不同数据
Q: 两个不同的文件可能有相同的 MD5 吗?
Section titled “Q: 两个不同的文件可能有相同的 MD5 吗?”A: 可能!这叫做「碰撞」。虽然概率极低,但已被证明可以实现。
Q: 为什么我的 MD5 和别人的不一样?
Section titled “Q: 为什么我的 MD5 和别人的不一样?”A: 检查:
- 编码方式(UTF-8 / GBK)
- 是否包含换行符
- 是否有首尾空格
- 大小写是否一致
Q: MD5 是加密算法吗?
Section titled “Q: MD5 是加密算法吗?”A: 不是! MD5 是哈希算法(散列函数),不是加密算法:
- 加密 - 可逆,可以解密还原
- 哈希 - 不可逆,无法还原
Q: 文件很大时如何计算 MD5?
Section titled “Q: 文件很大时如何计算 MD5?”A: 使用流式计算,避免内存溢出:
const crypto = require('crypto');const fs = require('fs');
const hash = crypto.createHash('md5');const stream = fs.createReadStream('large-file.zip');
stream.on('data', chunk => hash.update(chunk));stream.on('end', () => { console.log(hash.digest('hex'));});- SHA 加密 - SHA-1/256/512 哈希
- Base64 编解码 - Base64 编码
- HMAC 计算 - 消息认证码
- 密码生成器 - 强密码生成