SHA(Secure Hash Algorithm,安全散列算法)是一系列由美国 NIST(国家标准与技术研究院)发布的密码学哈希函数。SHA 算法广泛应用于:数据完整性校验、数字签名、HTTPS / TLS、区块链、文件指纹(digest)、认证协议(如 HMAC)等领域。
SHA(Secure Hash Algorithm)是一类密码学散列函数,用于将任意长度输入映射为固定长度摘要(digest)。摘要应具备:
SHA 的主要特点:
SHA 的主要家族:SHA-1、SHA-2(SHA-224/256/384/512)和 SHA-3(Keccak)。其中 SHA-1 已被弃用,SHA-2 是当前主流,SHA-3 引入了不同架构(sponge)。
**注意:**SHA不是“加密”(Encryption),而是“哈希”(Hash)
加密和HASH的区别:
| 项目 | 加密(Encryption) | 哈希(Hash / SHA) |
|---|---|---|
| 是否可逆 | 可逆(有密钥能解密) | 不可逆 |
| 输出长度 | 和输入差不多长 | 固定长度(如 256 bit) |
| 用途 | 保密通信 | 完整性校验、数字签名、存密码 |
SHA 系列主要包括以下版本:
| 算法名称 | 输出长度(bit) | 发布年份 | 当前安全状态(2025状态 | 典型用途 |
|---|---|---|---|---|
| SHA-0 | 160 | 1993 | 1995 就撤回,彻底破 | 历史文物 |
| SHA-1 | 160 | 1995 | 2017 碰撞,2020 正式死亡 | 仅遗留系统 |
| SHA-224 | 224 | 2004 | 安全(但几乎没人用) | 兼容性 |
| SHA-256 | 256 | 2001 | 完全安全(量子前) | 当前事实标准 |
| SHA-384 | 384 | 2001 | 完全安全 | 与椭圆曲线搭配 |
| SHA-512 | 512 | 2001 | 完全安全 | 高安全需求场景 |
| SHA-512/224 | 224 | 2012 | 安全 | 兼容旧系统 |
| SHA-512/256 | 256 | 2012 | 安全 | 替代 SHA-256 的截断版 |
| SHA-3-224 | 224 | 2015 | 完全安全(全新设计) | 未来导向项目 |
| SHA-3-256 | 256 | 2015 | 完全安全 | 推荐新项目使用 |
| SHA-3-384 | 384 | 2015 | 完全安全 | |
| SHA-3-512 | 512 | 2015 | 完全安全 | |
| SHAKE128 / SHAKE256 | 可变长度 | 2015 | 完全安全,可当随机数发生器 | XOF 扩展输出函数 |
简要时间线与动机:
设计要点对比:
各种算法加密效果(以“Hello World”为例)
| 算法 | 哈希值(十六进制) |
|---|---|
| SHA-1 | a0b659396fa95dh4a2b4e5c7d528f9af8c0e68d0(已废弃!) |
| SHA-256 | a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e |
| SHA-384 | 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863c4af0b1 |
| SHA-512 | 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1fe5a1737e93c548d7f0f3b2b9c8e1033f6d409a19f5e5b5 |
| SHA-3-256 | 3338be694f50c5f338814986cdf0686453a888b84f424d792af4b9202398f392 |
| SHAKE128(256bit) | 483366601360a8771a7150ed7465a1e3b3e6e3f2c06b7d8c9c2d3e8f1a2b3c4d |
虽然不同版本的 SHA 实现细节不同,但整体流程类似:
输入消息
↓
填充(Padding)
↓
分块处理(512 或 1024 bit)
↓
初始化哈希状态寄存器
↓
迭代压缩函数(多轮)
↓
输出固定长度摘要
与 MD5 类似,SHA-1 / SHA-2 使用 Merkle–Damgård 架构。
SHA-3 则使用全新的 海绵结构(Sponge Function)。
1 后跟若干 0,末尾追加 64-bit 原始长度(Big-endian)初始寄存器:8 个 32-bit 常数(来自平方根的分数部分)
每轮操作用到 8 个寄存器的混合更新:
T1 = h + Σ1(e) + Ch(e,f,g) + K[t] + W[t]
T2 = Σ0(a) + Maj(a,b,c)
h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2;
其中 Σ0/Σ1 是若干位旋转与异或组合,W[t] 为扩展的消息字。
b bits,分为两部分:容量(c)**和**速率(r),有 b = r + c。c 密切相关(理论上抗碰撞级别约为 2^(c/2))。w-bit 词矩阵(w = b/25)。r/c 以平衡吞吐与安全)。H(secret ∥ message) 做认证会被利用。| 年份 | 事件 | 攻击类型 | 实际复杂度 | 影响 |
|---|---|---|---|---|
| 2005 | 王小云差分攻击 SHA-1 | 碰撞 | 2⁶⁹ → 2⁶³ | 开启 SHA-1 死亡倒计时 |
| 2017 | Google & CWI 公布 SHAttered(首个公开 SHA-1 碰撞 PDF) | 实际碰撞 | ~2⁶³ GPU·年($110k) | 所有浏览器 2020 年前全部禁用 SHA-1 |
| 2020 | 选定前缀碰撞 SHA-1 降至 3 天(单台 RTX 3090 × 10) | Chosen-prefix collision | 2⁵⁰ 左右 | 彻底终结 SHA-1 |
| 2023 | SHA-256 理论差分概率微弱改进(学术) | 理论预碰撞 | 仍 > 2¹⁰⁰ | 无实际威胁 |
| 2024 | Keccak 实际 7轮碰撞(非标准参数) | 学术 | — | 标准 24 轮仍固若金汤 |
| 2025 | 量子时代预研:Grover 对 SHA-256 需 2¹²⁸ 次门操作(远超当前 NISQ) | 量子碰撞搜索 | 理论 2¹²⁸ | 2035 年前无量子威胁 |
| 场景 | 强烈推荐算法 | 理由 |
|---|---|---|
| 数字签名、HTTPS 证书 | SHA-256 或 SHA-3-256 | 全球标准,所有 CA 强制要求 |
| API 请求签名 | HMAC-SHA256 | 许多 API 使用 HMAC-SHA256 作签名 |
| 密码存储 | 改用 Argon2、bcrypt、scrypt | SHA 太快!必须加盐+多轮迭代 |
| 文件完整性校验 | SHA-256 或 BLAKE3 | BLAKE3 更快,但 SHA-256 更普遍 |
| 区块链、Git、Merkle 树 | SHA-256 | 比特币、以太坊、Git 都用它 |
| 需要抗量子攻击(未来准备) | SHA-3-512 或 SHAKE256 | 基于全新 Keccak,完全不同于 SHA-2 结构 |
| 需要可变长度输出(KDF、随机) | SHAKE128 / SHAKE256 | 可直接当加密级随机数发生器 |
| 生态系统 | 仍在使用的 SHA 算法 | 正在迁移目标 |
|---|---|---|
| HTTPS / TLS 证书 | SHA-256(99.9%+),极少数 SHA-384 | SHA-384(ECC 搭配) |
| Bitcoin | 双 SHA-256 | 长期无迁移计划 |
| Ethereum | Keccak-256(即 SHA-3 前身) | — |
| Git | SHA-1(历史对象)→ SHA-256(新项目) | 强制迁移中 |
| Linux 内核签名 | SHA-256 + RSA-4096 或 Ed25519+SHA512 | — |
| Apple / iOS 固件 | SHA-384(img4 格式) | — |
| Windows PE 签名 | 双证书:SHA-256 + SHA-384 fallback | — |
| 中国国密标准 | SM3(完全独立设计) | — |
H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ message))hash("prefix1" ∥ data) vs hash("prefix2" ∥ data))。若系统仍使用 SHA-1 或 MD5:
# Linux / macOS 命令行
echo -n "Hello World" | sha256sum
# a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e -
echo -n "Hello World" | sha3-256sum # 需要 coreutils 8.33+
# 3338be694f50c5f338814986cdf0686453a888b84f424d792af4b9202398f392
import hashlib, hmac
# SHA-256
def sha256_hex(data: bytes) -> str:
return hashlib.sha256(data).hexdigest()
# HMAC-SHA256
def hmac_sha256_hex(key: bytes, data: bytes) -> str:
return hmac.new(key, data, hashlib.sha256).hexdigest()
print(sha256_hex(b"hello world"))
print(hmac_sha256_hex(b"secret", b"message"))
import crypto from "crypto";
function sha256Hex(data) {
return crypto.createHash("sha256").update(data).digest("hex");
}
function hmacSha256Hex(key, data) {
return crypto.createHmac("sha256", key).update(data).digest("hex");
}
console.log(sha256Hex("hello world"));
console.log(hmacSha256Hex("secret", "message"));
#include <openssl/sha.h>
#include <stdio.h>
void print_sha256(const unsigned char *data, size_t len) {
unsigned char out[SHA256_DIGEST_LENGTH];
SHA256(data, len, out);
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) printf("%02x", out[i]);
printf("\n");
}
int main() {
print_sha256((const unsigned char*)"hello", 5);
return 0;
}
#include <openssl/sha.h>
#include <iomanip>
#include <iostream>
#include <sstream>
std::string sha256(const std::string &str) {
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256((unsigned char*)str.c_str(), str.size(), hash);
std::ostringstream ss;
for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i)
ss << std::hex << std::setw(2) << std::setfill('0')
<< (int)hash[i];
return ss.str();
}
int main() {
std::cout << sha256("Hello World") << std::endl;
}
SHA加密:支持在线SHA1、SHA3、SHA224、SHA256、SHA384、SHA512等方式对文本进行HASH计算
文件HASH: 支持在线SHA1、SHA256、SHA512等文件HASH值计算
Keccak加密:支持在线 Keccak-224、Keccak-256、Keccak-384、Keccak-512等方式对文本进行HASH计算
Q1:SHA-256 会被破解吗?
A:截至 2025 年,无任何实际碰撞攻击。理论碰撞复杂度仍高达 2¹²⁸,远超人类计算能力。量子计算机理论可降到 2⁸⁵,仍遥不可及。
Q2:SHA-1 还能用吗?
A:绝对不能!GitHub 从 2017 年起拒绝 SHA-1 证书,所有浏览器 2017–2020 年间全部禁用。
Q3:SHA-512 比 SHA-256 更安全吗?
A:对经典攻击是的(碰撞抵抗 2²⁵⁶ vs 2¹²⁸),但在 64 位系统上 SHA-512 通常更快。实际中 SHA-256 足够。
Q4:SHA-3 比 SHA-2 更安全吗?
A:目前安全强度相当,但 SHA-3 基于全新 Sponge 结构,即使 SHA-2 将来被攻破,SHA-3 仍安全。推荐新项目优先 SHA-3。
SHA-2 依然坚若磐石,且在现代 CPU 上速度极快。但在需要极致安全性或特定嵌入式硬件场景下,SHA-3 代表了密码学的未来方向。对于开发者而言,理解这些底层差异,是正确选择算法(如 SHA-256 vs HMAC-SHA256 vs Bcrypt)的关键。