跳至正文

哈希生成器

生成 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 来说实际上不可能。

问:如何计算文件哈希?

此工具仅支持文本。对于文件哈希,请使用命令行工具或专用程序。

相关工具

性能

  • 生成速度:小于毫秒(基于文本)
  • 实时处理:输入时即时生成
  • 内存使用:最小
  • 离线操作:完全支持

浏览器兼容性

此工具使用 Web Crypto API:

  • Chrome(所有版本)✓
  • Firefox(所有版本)✓
  • Safari 11+ ✓
  • Edge(所有版本)✓

💬 这个工具对您有帮助吗?

如果您觉得哈希生成器有用,请分享给需要的朋友!我们持续改进工具以提供更好的服务。

隐私保护

此工具完全在客户端运行。您输入的数据不会发送到服务器,仅在浏览器中处理。