1. MessageDigest类与加密算法基础
第一次接触Java的MessageDigest类是在2013年做用户密码存储功能时。当时项目组要求对用户密码进行加密存储,我毫不犹豫地选择了MD5算法——就像大多数刚入行的Java开发者一样。直到后来系统被拖库,看到黑客用彩虹表轻松破解了我们的"加密"密码,才真正理解到选择加密算法的重要性。
MessageDigest是Java安全体系中的核心类,位于java.security包下。它提供了一种标准化的方式来生成数据的数字指纹(digest),这种指纹具有两个关键特性:一是不可逆性,无法从摘要反推出原始数据;二是唯一性,不同数据产生相同摘要的概率极低。
常用的算法包括:
- MD5:生成128位(16字节)摘要,曾经广泛使用但已被证明不安全
- SHA-1:生成160位摘要,安全性高于MD5但同样不再推荐
- SHA-256:SHA-2家族成员,生成256位摘要,当前主流选择
- SHA-512:生成512位摘要,安全性更高但计算开销更大
实际开发中最容易踩的坑就是直接使用MD5存储密码。记得有次代码审查,我发现团队新人这样写密码加密:
java复制// 反面示例:直接MD5加密密码
public static String encryptPassword(String password) {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(password.getBytes());
return Hex.encodeHexString(digest);
}
这种写法有三个严重问题:一是使用不安全的MD5算法;二是没有加盐(salt),容易被彩虹表攻击;三是直接使用getBytes()没有指定字符集。正确的做法应该使用PBKDF2、bcrypt等专门设计用于密码哈希的算法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从MD5到SHA-256的算法演进
2017年某电商平台数据泄露事件是个重要转折点,当时黑客利用MD5的碰撞漏洞伪造了支付凭证。这件事之后,行业开始大规模迁移到SHA-256算法。下面通过具体代码对比两种算法的差异:
java复制/
