SHA-256 算法
SHA-256 是一种 密码学哈希算法(Cryptographic Hash Function),属于 SHA-2(Secure Hash Algorithm 2) 系列,由美国国家安全局(NSA)设计,并由 NIST 于 2001 年发布的。
它的输出固定为 256 位(32 字节),无论输入数据多长,结果长度都相同。
🔹 一、SHA-256 的主要特性
特性 | 说明 |
---|---|
输入长度 | 任意长度的消息 |
输出长度 | 固定 256 位(32 字节) |
安全性 | 目前被认为是安全的(截至 2025 年) |
抗碰撞性 | 极难找到两个不同的输入得到相同的哈希 |
抗预映像性 | 极难从哈希值反推出原始输入 |
确定性 | 同样的输入必然产生同样的输出 |
🔹 二、SHA-256 工作流程(算法原理)
SHA-256 的计算过程主要包括以下步骤:
-
消息填充(Padding)
-
在消息末尾添加一个
1
,然后添加足够的0
,使得长度 ≡ 448 (mod 512)。 -
最后再附加一个 64 位的原始消息长度(单位:比特)。
-
-
分块处理(Parsing)
-
将填充后的消息分为多个 512 位块。
-
-
初始化哈希值(Initialization)
-
定义 8 个初始常量:
H0 = 0x6a09e667 H1 = 0xbb67ae85 H2 = 0x3c6ef372 H3 = 0xa54ff53a H4 = 0x510e527f H5 = 0x9b05688c H6 = 0x1f83d9ab H7 = 0x5be0cd19
-
-
计算消息调度表(Message Schedule)
-
每个块生成 64 个 32 位字:
W0~W15 由块数据直接得到 Wt = σ1(Wt−2) + Wt−7 + σ0(Wt−15) + Wt−16
-
-
64 轮压缩(Compression Rounds)
每轮使用以下操作:然后更新:
h = g g = f f = e e = d + T1 d = c c = b b = a a = T1 + T2
其中:
Ch(x,y,z) = (x & y) ^ (~x & z) Maj(x,y,z) = (x & y) ^ (x & z) ^ (y & z) Σ0(x) = ROTR2(x) ^ ROTR13(x) ^ ROTR22(x) Σ1(x) = ROTR6(x) ^ ROTR11(x) ^ ROTR25(x) σ0(x) = ROTR7(x) ^ ROTR18(x) ^ SHR3(x) σ1(x) = ROTR17(x) ^ ROTR19(x) ^ SHR10(x)
-
更新哈希值(Update State)
每个数据块处理后,更新 8 个哈希寄存器:H0 = H0 + a H1 = H1 + b ... H7 = H7 + h
-
输出结果
拼接最终的 8 个 32 位寄存器:H = H0 || H1 || H2 || H3 || H4 || H5 || H6 || H7
🔹 三、示例(Python 实现)
import hashlibdata = b"hello world"
hash_value = hashlib.sha256(data).hexdigest()print(hash_value)
输出:
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
🔹 四、应用场景
应用 | 说明 |
---|---|
数字签名 | 与 RSA/ECDSA 等结合,验证数据完整性 |
密码存储 | 常与 salt 一起使用(如 bcrypt、PBKDF2) |
区块链 | 比特币的核心哈希算法 |
完整性校验 | 文件或固件验证(如 sha256sum 命令) |
🔹 五、与其他哈希算法的比较
算法 | 输出长度 | 安全性 | 速度 | 备注 |
---|---|---|---|---|
MD5 | 128 位 | 弱 | 快 | 已被弃用 |
SHA-1 | 160 位 | 不安全 | 中 | 已弃用 |
SHA-256 | 256 位 | 安全 | 稍慢 | 推荐 |
SHA-512 | 512 位 | 更安全 | 慢 | 用于高安全场合 |
SHA3-256 | 256 位 | 新标准 | 慢 | 基于 Keccak 设计 |