SHA-1哈希生成器

从任何文本生成SHA-1哈希

输入文本

本地运行 · 粘贴密钥安全无忧

SHA-1哈希

SHA-1哈希将显示在这里…

什么是SHA-1哈希?

SHA-1(安全哈希算法1)是一种密码哈希函数,无论输入大小如何,都能从任意输入生成固定160位(20字节)的摘要。SHA-1由NSA发布,1995年由NIST以FIPS PUB 180-1标准化,后在RFC 3174中记录,被设计为SHA-0和MD5更强的继承者。该算法将输入以512位为一块进行处理,经过80轮位运算,生成40个字符的十六进制指纹,在十余年间作为SSL/TLS、PGP、SSH和IPsec的核心被广泛使用。

与所有密码哈希函数一样,SHA-1是一种单向变换:给定输入,可以快速计算哈希值,但仅凭哈希值无法还原原始输入。输入中哪怕只改变一个比特,也会产生完全不同的160位摘要——这一特性称为雪崩效应。SHA-1将任意大小的输入空间映射到固定的160位输出,因此从数学上讲,碰撞(两个不同输入产生相同哈希)必然存在。哈希函数的安全性要求找到碰撞大约需要2^80次运算——即输出位长度的一半。

2017年,Google与CWI阿姆斯特丹发布了SHAttered攻击,通过生成两个摘要相同的不同PDF文件,首次演示了实际的SHA-1碰撞。该攻击约需2^63.1次SHA-1运算——远低于理论上的2^80界限。2020年,Gaetan Leurent和Thomas Peyrin进一步降低了攻击成本,选择前缀碰撞攻击仅需约2^63.4次运算。因此,所有主流浏览器、证书颁发机构和标准机构均已弃用SHA-1用于数字签名和TLS证书。然而,SHA-1在非安全用途中仍然活跃:Git对象ID(尽管Git正在迁移至SHA-256)、遗留HMAC构造,以及无需对抗性抗碰撞性的文件完整性校验。

为什么使用这个SHA-1生成器?

无需安装任何软件或编写代码,即可即时生成SHA-1哈希。粘贴文本,实时获取40个字符的十六进制摘要——适用于验证遗留校验和、调试Git内部机制或测试基于哈希的工作流。

即时哈希
输出随输入实时更新,无需点击按钮,无需等待——SHA-1摘要会随着您修改输入逐字符出现。
🔒
隐私优先处理
所有哈希运算均在浏览器中通过Web Crypto API本地执行。您的输入文本不会离开您的设备,也不会发送到任何服务器。
📋
一键复制
单击即可将哈希值复制到剪贴板。可在小写和大写十六进制输出之间切换,以匹配您系统所需的格式。
🔍
无需账号
无需注册,无需登录,无使用限制。打开页面即可立即开始哈希运算,支持任何现代浏览器的设备。

SHA-1使用场景

Git内部机制与调试
Git通过SHA-1哈希标识每个对象(提交、树、blob、标签)。在调试Git底层命令、验证pack文件或编写自定义Git工具时,使用SHA-1生成器可以快速核对对象ID与预期值是否一致。
遗留系统验证
许多旧系统、包注册表和固件更新机制仍会在下载文件旁边发布SHA-1校验和。在无法获取SHA-256摘要时,生成并比较SHA-1哈希以验证文件完整性。
子资源完整性(SRI)
虽然sha256和sha384是HTML script和link标签中SRI哈希的首选,但部分遗留CDN配置仍依赖SHA-1。生成预期摘要以审计或迁移现有SRI属性。
质量保证与回归测试
比较测试运行之间API响应、构建产物或数据库快照的SHA-1哈希,以检测意外变化,而无需对大型输出进行完整的逐字节差异比较。
数据去重
在ETL流水线中计算文件内容或数据记录的SHA-1哈希以识别重复项。160位输出在非对抗性去重场景中提供比MD5更强的唯一性保证。
学习与教育
SHA-1是一种有大量学术文献记录的算法。通过实验了解Merkle-Damgård结构、消息调度,以及当输出长度相对于现代计算能力过短时,抗碰撞性为何会失效。

SHA-1与其他哈希算法对比

SHA-1生成160位摘要——比MD5(128位)长,但远短于SHA-2系列算法。下表比较了各算法的摘要大小、标准和适用场景。

算法摘要大小十六进制长度标准最佳用途
SHA-1160 bits40 hex chars1995 / RFC 3174Deprecated — legacy git commits, old TLS
SHA-256256 bits64 hex chars2001 / FIPS 180-4TLS certificates, blockchain, JWTs
SHA-384384 bits96 hex chars2001 / FIPS 180-4Government systems, higher security margin
SHA-512512 bits128 hex chars2001 / FIPS 180-4Digital signatures, HMAC with large keys
MD5128 bits32 hex chars1992 / RFC 1321Checksums only — broken since 2004
SHA-3256 bits64 hex chars2015 / FIPS 202Post-quantum readiness, alternative to SHA-2
BLAKE3256 bits64 hex chars2020High-performance checksums, Merkle trees

SHA-1的工作原理

SHA-1遵循Merkle-Damgård结构:对消息进行填充,分割成512位的块,每块经过80轮位运算处理,将输入与从该块派生的消息调度混合。五个32位状态字(H0至H4)保存运行中的哈希状态,这些状态字最终拼接生成160位摘要。

Input: "hello world"
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
步骤说明
PaddingAppend a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer.
Block splittingDivide the padded message into 512-bit (64-byte) blocks.
ExpansionExpand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule.
CompressionProcess 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79.
OutputConcatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters.

SHA-1与MD5的关键区别在于状态字数量(5个对4个)、每块的轮数(80轮对64轮),以及使用带左旋转反馈的消息调度。这些差异使SHA-1具有更大的输出(160位对128位),并最初提供了更高的安全裕度,但两种算法现在都被认为在抗碰撞性方面已被攻破。

代码示例

如何在常用语言和环境中生成SHA-1哈希。与MD5不同,SHA-1在浏览器Web Crypto API中可用,因此在浏览器和Node.js环境中均可无需外部库直接使用。

JavaScript (Web Crypto API — browser & Node.js)
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
  const data = new TextEncoder().encode(text)
  const hashBuffer = await crypto.subtle.digest('SHA-1', data)
  const hashArray = Array.from(new Uint8Array(hashBuffer))
  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}

await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
Python
import hashlib

# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result)  # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"

# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"

# Hash a file in chunks
with open('file.bin', 'rb') as f:
    sha1 = hashlib.sha1()
    for chunk in iter(lambda: f.read(8192), b''):
        sha1.update(chunk)
    print(sha1.hexdigest())
Go
package main

import (
    "crypto/sha1"
    "fmt"
)

func main() {
    data := []byte("hello world")
    hash := sha1.Sum(data)
    fmt.Printf("%x\n", hash)
    // → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}
CLI (Linux / macOS)
# Using sha1sum (Linux) or shasum (macOS)
echo -n "hello world" | sha1sum
# → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed  -

# macOS
echo -n "hello world" | shasum -a 1
# → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed  -

# Hash a file
sha1sum package.json
# → a1b2c3d4e5f6...  package.json

# Using openssl (cross-platform)
echo -n "hello world" | openssl sha1
# → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed

常见问题

SHA-1现在还安全吗?
对于安全敏感的应用场景,SHA-1并不安全。2017年的SHAttered攻击演示了实际的碰撞生成,2020年的选择前缀攻击进一步降低了成本。对于数字签名、TLS证书,或任何攻击者可能构造碰撞输入的场景,请改用SHA-256或SHA-3。对于校验和、缓存键等非安全用途(无攻击者控制输入),SHA-1仍然可以正常使用。
SHA-1和SHA-256有什么区别?
SHA-1生成160位(40个十六进制字符)摘要,且易受碰撞攻击。SHA-256生成256位(64个十六进制字符)摘要,属于SHA-2系列,目前没有已知的实际攻击。在相同硬件上,SHA-256比SHA-1慢约20-30%,但额外的96位输出以及无已知结构性弱点,使其成为任何新项目的默认推荐选择。
为什么Git使用SHA-1?
Linus Torvalds在2005年设计Git时,SHA-1被认为是安全的,并在速度与内容寻址存储的抗碰撞性之间取得了良好平衡。Git将SHA-1用作内容标识符而非安全机制——它检测的是意外损坏,而非蓄意篡改。自2021年起,Git已通过git-hash-function-transition计划中描述的哈希扩展框架开始向SHA-256迁移。
能否将SHA-1哈希还原为原始输入?
不能。SHA-1是一种单向函数,在哈希过程中会丢弃信息。对于短或常见的输入,攻击者可以使用彩虹表或暴力破解来找到原始明文,但这不是算法的逆向——而是对输入空间的穷举搜索。密码存储请使用bcrypt、scrypt或Argon2,而非任何快速哈希函数。
SHAttered攻击是如何工作的?
SHAttered攻击利用了SHA-1压缩函数中的结构性弱点。通过精心构造两个产生相同中间哈希状态的不同512位消息块,攻击者创建了两个SHA-1摘要相同但内容不同的PDF文件。该攻击约需2^63次SHA-1运算——相当于单CPU约6500年的计算时间,但在GPU集群上数月内即可完成。随着技术改进,攻击成本已进一步降低。
SHA-1和HMAC-SHA1有什么区别?
SHA-1是普通哈希函数:hash = SHA1(message)。HMAC-SHA1是带密钥的消息认证码:mac = HMAC(key, message)。HMAC将哈希函数包装在一种可防止长度扩展攻击并需要密钥的构造中。有趣的是,尽管SHA-1本身在抗碰撞性方面已被攻破,HMAC-SHA1在消息认证方面仍被认为是安全的,因为HMAC的安全性依赖于压缩函数的伪随机函数特性,而非抗碰撞性。
文件校验应使用SHA-1还是MD5?
对于文件校验和,SHA-1是比MD5更好的选择。MD5生成128位摘要,自2004年起已被攻破,实际碰撞攻击现在可在数秒内完成。SHA-1生成160位摘要,其碰撞攻击虽已被证明,但成本仍然更高。然而,对于任何新系统,优先选择SHA-256——它提供256位摘要,目前无已知实际攻击,且在所有平台和语言中均有良好支持。