1. 什么是SHA加密算法?
第一次接触SHA是在2013年做用户密码存储方案时。当时数据库被拖库事件频发,很多网站存储的明文密码直接暴露。我们团队经过多方对比,最终选择了SHA-256作为密码哈希算法。这么多年过去,SHA算法家族已经成为现代密码学的基石之一。
SHA(Secure Hash Algorithm)是一组由美国国家标准与技术研究院(NIST)制定的密码散列函数标准。它的核心作用是将任意长度的输入数据(比如一段文字、文件)转换成固定长度的输出(通常称为哈希值或摘要),这个转换过程具有以下关键特性:
- 确定性:相同输入永远产生相同输出
- 快速计算:对给定输入能快速计算出哈希值
- 不可逆性:从哈希值无法反推出原始输入
- 抗碰撞性:极难找到两个不同输入产生相同哈希值
- 雪崩效应:输入微小变化会导致输出完全不同
在实际开发中,我主要用SHA算法做这些事:
- 用户密码加密存储(配合盐值使用)
- 文件完整性校验(比如下载的ISO镜像验证)
- 区块链中的交易指纹生成
- 数字签名的基础组件
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SHA算法家族演进史
2.1 初代SHA-0和SHA-1
1993年,NIST发布了SHA-0(后来被称为SHA),输出160位哈希值。但很快发现存在安全弱点,于是在1995年发布改进版SHA-1。在早期项目中,我见过不少老系统还在使用SHA-1,比如:
python复制import hashlib
hash_object = hashlib.sha1(b'Hello World')
hex_dig = hash_object.hexdigest()
print(hex_dig) # 输出:0a4d55a8d778...
但到2017年,Google成功实施了SHA-1碰撞攻击(两个不同PDF产生相同哈希),NIST正式要求停用SHA-1。现在如果还在用SHA-1,安全审计肯定会开不符合项。
2.2 SHA-2系列:当前的主力军
SHA-2是现在最广泛使用的版本,包含多个变种:
- SHA-224:输出224位,适用于资源受限环境
- SHA-256:平衡安全与性能的黄金标准
- SHA-384/SHA-512:更高安全级别
- SHA-512/224、SHA-512/256:特殊用途
在Java中使用SHA-256的典型代码:
java复制import java.security.MessageDigest;
public class SHAExample {
public static void main(String[] args) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest("Hello World".getBytes("UTF-8"));
//
