
1) 【一句话结论】SHA-256是一种密码学安全哈希算法,通过分块处理、64轮迭代压缩函数生成256位固定长度的哈希值,适用于密码存储(需加盐防预计算)和数字签名,但需防范碰撞攻击(复杂度约2^128次操作)和预计算攻击(需强盐+多次哈希)。
2) 【原理/概念讲解】老师口吻,分步骤解释核心机制:
3) 【对比与适用场景】
| 特性/场景 | SHA-256 | MD5 | SHA-1 |
|---|---|---|---|
| 定义 | 256位哈希,密码学安全 | 128位,已被破解 | 160位,已被破解 |
| 抗碰撞性 | 2^128次操作(生日攻击概率50%) | 2^64次操作 | 2^80次操作 |
| 预计算攻击 | 需强盐值+多次哈希(如PBKDF2)防范 | 易受彩虹表攻击 | 易受彩虹表攻击 |
| 密码存储 | 推荐(需加盐+多次哈希) | 不推荐 | 不推荐 |
| 数字签名 | 推荐(与RSA等非对称加密配合) | 不推荐 | 不推荐 |
| 文件校验 | 推荐(快速校验) | 推荐(但已不安全) | 推荐(但已不安全) |
4) 【示例】(伪代码展示哈希过程,简化64轮):
function SHA256(message):
H = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x5f1d36f1, 0x5be0cd19, 0x2b697881, 0x256b303f]
padded = pad(message) // 填充后长度为512k+448位
for each 512-bit block in padded:
W = expand(block) // 扩展为64个32位字
for i in 0..63:
if i < 16:
temp = H[i] + f(i, W[i], W[i+4]) + K[i] + W[i+16]
else:
temp = sigma1(W[i-2]) + W[i]
H[i%8] = H[i%8] + temp
return H
其中pad函数:将消息长度左移1位,后跟k个0,最后2字节表示原长度(补0后16位);expand函数:通过循环左移、异或等操作将16字扩展为64字;f为轮函数(Ch/Maj),K为轮常数。
5) 【面试口播版答案】
“面试官您好,我来解释SHA-256的工作原理。SHA-256是一种密码学哈希算法,核心是将任意长度的消息通过分块处理、64轮迭代压缩函数生成256位固定长度的哈希值。具体来说,它先对输入消息进行填充,使其长度满足512位的倍数,然后分成16个32位字,再通过扩展函数将每个块扩展为64个字。接着,对每个块进行64轮压缩,每轮使用不同的非线性函数(如Ch、Maj)和轮常数,更新8个状态寄存器。最后,将这8个寄存器的值拼接起来,得到256位的哈希值。在安全场景中,它常用于密码存储(比如用户密码哈希后存储,即使数据库泄露,攻击者也无法直接获取明文)和数字签名(比如数字签名中,哈希消息后用私钥加密,公钥验证,确保消息完整性和来源可信)。不过,SHA-256也存在安全风险,比如碰撞攻击(理论上存在,复杂度约2^128次操作,根据生日攻击理论,碰撞概率在操作次数达到2^128时接近50%)和预计算攻击(预先计算大量哈希值,用于暴力破解)。为了增强安全性,密码存储场景中通常采用强随机盐值(每个用户独立生成,长度≥16字节,存储在数据库中,防止彩虹表攻击),并结合多次哈希(如PBKDF2,通过1000次以上迭代增加计算成本),或者升级到更安全的算法(如SHA-3)。”
6) 【追问清单】
7) 【常见坑/雷区】