哈希生成器
生成 MD5、SHA-1、SHA-256、SHA-512 哈希值的免费在线工具。
📝 输入文本
✨ 生成的哈希
MD5128-bit
SHA-1160-bit
SHA-256256-bit ⭐ 권장
SHA-512512-bit
哈希函数将任意大小的数据转换为固定大小的值。用于密码存储、文件完整性验证等。SHA-256 是目前最推荐的算法。
什么是哈希函数?
哈希函数是将任意大小的数据转换为固定大小值(哈希)的单向函数。相同的输入始终生成相同的哈希值,但无法从哈希值恢复原始数据。
主要功能
- 4 种算法:MD5、SHA-1、SHA-256、SHA-512
- 实时生成:输入时即时生成哈希值
- 快速复制:一键复制每个哈希值
- 多语言支持:完美支持 UTF-8(中文、日语、韩语等)
- 推荐算法标识:推荐使用 SHA-256
支持的算法
MD5 (128-bit) ⚠️
- 长度:32 个字符(十六进制)
- 速度:非常快
- 安全性:脆弱 - 存在碰撞攻击
- 用途:校验和、旧系统
输入:Hello World
MD5:b10a8db164e0754105b7a99be72e3fe5
SHA-1 (160-bit) ⚠️
- 长度:40 个字符(十六进制)
- 速度:快
- 安全性:脆弱 - 存在碰撞攻击
- 用途:Git(旧版)、校验和
输入:Hello World
SHA-1:0a4d55a8d778e5022fab701977c5d840bbc486d0
SHA-256 (256-bit) ⭐ 推荐
- 长度:64 个字符(十六进制)
- 速度:中等
- 安全性:强大 - 目前安全
- 用途:密码哈希、区块链、数字签名
输入:Hello World
SHA-256:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
SHA-512 (512-bit)
- 长度:128 个字符(十六进制)
- 速度:比 SHA-256 慢(在 64 位系统上可能更快)
- 安全性:非常强大
- 用途:高安全性要求
输入:Hello World
SHA-512:2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b
使用场景
1. 密码存储(SHA-256 + Salt)
const password = 'myPassword123';
const salt = generateRandomSalt(); // UUID 等
const hash = sha256(password + salt);
// 存储到数据库
// { username: 'user1', hash: '...', salt: '...' }
⚠️ 注意:实际应用中推荐使用 bcrypt、argon2 等专用算法!
2. 文件完整性验证
# 验证下载文件的哈希值
$ sha256sum ubuntu-22.04.iso
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
# 与官方哈希值比较
3. API 签名
const data = { userId: 123, amount: 100 };
const secret = 'api-secret-key';
const signature = sha256(JSON.stringify(data) + secret);
// 包含在请求头中
// X-Signature: a591a6d40bf420404a011733cfb7b190...
4. Git 提交 ID
# Git 使用 SHA-1(每个提交的唯一 ID)
$ git log --oneline
a591a6d Fix bug in login
b10a8db Add new feature
5. 缓存键生成
const cacheKey = md5(`user:${userId}:profile`);
cache.set(cacheKey, userData);
6. 数据去重
const contentHash = sha256(fileContent);
if (seenHashes.has(contentHash)) {
console.log('重复文件');
} else {
seenHashes.add(contentHash);
}
哈希碰撞
什么是碰撞?
不同的输入产生相同的哈希值:
input1 ≠ input2
hash(input1) = hash(input2) ← 碰撞!
各算法的碰撞抵抗能力
| 算法 | 碰撞抵抗能力 | 状态 |
|---|---|---|
| MD5 | ❌ 非常弱 | 2004 年以来发现碰撞 |
| SHA-1 | ❌ 弱 | 2017 年公开实际碰撞 |
| SHA-256 | ✅ 强 | 目前安全 |
| SHA-512 | ✅ 非常强 | 目前安全 |
碰撞概率
SHA-256 的情况:
- 可能的哈希数量:2^256 ≈ 1.16 × 10^77
- 生日悖论 50% 碰撞概率:需要 2^128 次尝试
- 实际上不可能!
各编程语言的使用方法
JavaScript(浏览器)
async function sha256(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const hash = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hash));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
const hash = await sha256('Hello World');
JavaScript(Node.js)
const crypto = require('crypto');
const hash = crypto.createHash('sha256')
.update('Hello World')
.digest('hex');
Python
import hashlib
# SHA-256
hash_sha256 = hashlib.sha256('Hello World'.encode()).hexdigest()
# MD5
hash_md5 = hashlib.md5('Hello World'.encode()).hexdigest()
PHP
<?php
// SHA-256
$hash = hash('sha256', 'Hello World');
// MD5
$hash = md5('Hello World');
?>
Java
import java.security.MessageDigest;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest("Hello World".getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
Bash
# SHA-256
echo -n "Hello World" | sha256sum
# MD5
echo -n "Hello World" | md5sum
安全最佳实践
✅ 正确使用
1. 密码存储(Salt + Hash)
const bcrypt = require('bcrypt');
// 密码哈希
const hash = await bcrypt.hash(password, 10);
// 验证
const isValid = await bcrypt.compare(password, hash);
2. API 签名验证
const expectedSignature = sha256(payload + secret);
if (receivedSignature === expectedSignature) {
// 有效请求
}
3. 文件校验和
const fileHash = sha256(fileContent);
// 下载后验证
❌ 错误使用
1. 仅使用简单哈希存储密码
// 错误!
const hash = md5(password);
// 容易受到彩虹表攻击
2. 将 MD5 用于安全目的
// 错误!
const signature = md5(data + secret);
// 存在碰撞攻击风险
3. 仅用哈希进行身份验证
// 错误!
if (requestHash === sha256(userId)) {
// 可预测
}
实用技巧
1. 使用 Salt(密码)
// 添加 Salt 以防御彩虹表攻击
const salt = crypto.randomBytes(16).toString('hex');
const hash = sha256(password + salt);
// 存储:{ hash, salt }
2. 使用 HMAC(签名)
// HMAC 比简单哈希更安全
const hmac = crypto.createHmac('sha256', secret)
.update(data)
.digest('hex');
3. 使用慢哈希(密码)
// bcrypt、scrypt、argon2 故意设计得很慢
// 防御暴力破解攻击
const hash = await bcrypt.hash(password, 12); // rounds
4. 文件哈希流式处理
// 大文件使用流式处理
const hash = crypto.createHash('sha256');
const stream = fs.createReadStream('largefile.bin');
stream.on('data', chunk => hash.update(chunk));
stream.on('end', () => {
console.log(hash.digest('hex'));
});
哈希 vs 加密
哈希(Hash)
- 单向:无法解密
- 固定长度:与输入大小无关
- 确定性:相同输入 → 相同输出
- 用途:完整性验证、密码存储
加密(Encryption)
- 双向:可以解密
- 可变长度:与输入成比例
- 非确定性:每次可能产生不同输出
- 用途:数据保护、通信安全
常见问题
问:可以使用 MD5 吗?
绝对不能用于安全目的。仅用于校验和或非安全用途。
问:可以用哈希存储密码吗?
简单哈希不安全。请使用 bcrypt、argon2、scrypt 等专用算法。
问:SHA-256 和 SHA-512 哪个更好?
- SHA-256:大多数情况下足够,广泛使用
- SHA-512:更强大但可能更慢(在 64 位系统上可能更快)
一般推荐 SHA-256!
问:可以解密哈希吗?
不可以。哈希是单向函数。但是,可以通过彩虹表猜测弱密码。
问:可能产生相同的哈希吗?
理论上可能(鸽笼原理),但对于 SHA-256 来说实际上不可能。
问:如何计算文件哈希?
此工具仅支持文本。对于文件哈希,请使用命令行工具或专用程序。
相关工具
- Base64 编码器 - Base64 编码/解码
- UUID 生成器 - 生成唯一标识符
- 密码生成器 - 生成强密码
性能
- 生成速度:小于毫秒(基于文本)
- 实时处理:输入时即时生成
- 内存使用:最小
- 离线操作:完全支持
浏览器兼容性
此工具使用 Web Crypto API:
- Chrome(所有版本)✓
- Firefox(所有版本)✓
- Safari 11+ ✓
- Edge(所有版本)✓
💬 这个工具对您有帮助吗?
如果您觉得哈希生成器有用,请分享给需要的朋友!我们持续改进工具以提供更好的服务。
隐私保护
此工具完全在客户端运行。您输入的数据不会发送到服务器,仅在浏览器中处理。