java中messagedigest类通过指定算法名(如"sha-256")生成确定性摘要,需规范字符串转字节数组(推荐utf-8)、手动转小写十六进制字符串(补零至32/40/64位),用于完整性校验;md5和sha-1已不安全,应优先选用sha-256及以上。

Java 中的 MessageDigest 类可统一实现 MD5、SHA-1、SHA-256 等摘要算法,核心在于指定正确的算法名称并规范处理字节数组与十六进制转换。关键不是“变量加密”,而是对任意输入(字符串、文件、字节数组)生成确定性摘要值,用于完整性校验。
选择算法并初始化 MessageDigest 实例
不同算法通过字符串参数区分,大小写敏感,常见合法值有 "MD5"、"SHA-1"、"SHA-256"、"SHA-512"。调用 MessageDigest.getInstance(algorithm) 获取实例,若算法不支持会抛出 NoSuchAlgorithmException。
- 推荐显式指定字符集(如 UTF-8)将字符串转为字节数组,避免平台默认编码差异导致校验失败
- 同一算法对相同输入始终产生相同摘要,这是校验的基础
计算摘要并转为标准十六进制字符串
digest() 方法返回原始字节数组,需手动转为小写十六进制字符串(32位 MD5 / 40位 SHA-1 / 64位 SHA-256),不可直接用 new String(byte[]) 输出。
- 逐字节处理:高位补零(
String.format("%02x", b & 0xFF)),确保每位字节输出两位十六进制字符 - 避免使用
BigInteger.toString(16),它会省略前导零,导致长度不固定、校验失败 - 示例:对字符串
"hello"计算 SHA-256,应得"2cf24dba89f8b579e1e0a72a3f3e85756c7e5d17f92203b1b9450a0b156995e7"(64 字符)
校验逻辑:比对摘要字符串而非原始内容
校验时,对新数据重新计算摘要,与已知摘要字符串(通常来自配置、数据库或签名文件)进行 equals() 比较。不建议比对原始内容,因摘要不可逆且更高效安全。
- 存储和传输摘要时统一用小写十六进制字符串,避免大小写混淆
- 若需防篡改+身份认证,应升级为 HMAC(如
Mac.getInstance("HmacSHA256")),配合密钥使用 - 注意:MD5 和 SHA-1 已不推荐用于安全场景(存在碰撞攻击),优先选用 SHA-256 或更高
封装成工具方法提升复用性
将算法名、输入和编码作为参数,返回标准化摘要字符串,避免重复代码。可增加空值判断和异常包装(如转为 RuntimeException)。
- 方法签名示例:
public static String digest(String input, String algorithm, String charset) - 内部统一用
UTF-8编码,不依赖系统默认,保障跨环境一致性 - 调用方只需关注输入内容和期望算法,无需关心底层字节处理细节










