java中用messagedigest计算sha-256哈希值的核心步骤是:先将字符串按utf-8编码转为字节数组,再通过messagedigest.getinstance("sha-256")获取实例并执行digest(),最后将32字节结果逐字节格式化为小写十六进制字符串(不足两位补零)。

Java 中用 MessageDigest 计算字符串的 SHA-256 哈希值,核心是把字符串转成字节数组(指定 UTF-8 编码),再用 SHA-256 算法摘要,最后将字节数组转为十六进制字符串表示。
获取 MessageDigest 实例并更新数据
SHA-256 是标准算法名,直接传入 "SHA-256" 即可。注意必须指定字符编码(推荐 UTF-8),避免不同平台默认编码不一致导致结果不同。
- 调用
MessageDigest.getInstance("SHA-256")获取实例 - 用
digest.update(input.getBytes(StandardCharsets.UTF_8))输入原始字节 - 或一步到位:
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8))
将哈希字节数组转成十六进制字符串
SHA-256 输出是 32 字节(256 位)的二进制数组,直接 toString() 没有意义。需逐字节转成两位十六进制字符(不足补零)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
String.format("%02x", b)格式化每个字节(%02x表示小写、至少两位、不足补零) - 也可用
BigInteger(1, hash).toString(16),但要注意高位补零问题(长度可能不足 64 位) - 推荐循环拼接或使用
StringBuilder提升效率
完整可运行示例代码
以下是一个简洁、安全、无依赖的实现:
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA256Util {
public static String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
调用方式:SHA256Util.sha256("hello") → 返回 "2cf24dba89f8b0a73d64e94a7745e1c10b51355843321438712289814854287a"
注意事项和常见坑
实际使用中容易忽略几个关键点:
- 务必用
StandardCharsets.UTF_8,不要用String.getBytes()(依赖系统默认编码) -
MessageDigest实例不是线程安全的,多线程场景应每次新建或使用ThreadLocal缓存 - SHA-256 是哈希(不可逆),不是加密;它不加盐,直接哈希明文密码存在彩虹表攻击风险
- 如需密码哈希,请改用
SecretKeyFactory+PBKDF2WithHmacSHA256或专用库如 BCrypt
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










