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() 没有意义。需逐字节转成两位十六进制字符(不足补零)。
- 用
String.format("%02x", b)格式化每个字节(%02x表示小写、至少两位、不足补零) - 也可用
BigInteger(1, hash).toString(16),但要注意高位补零问题(长度可能不足 64 位) - 推荐循环拼接或使用
StringBuilder提升效率
完整可运行示例代码
以下是一个简洁、安全、无依赖的实现:
立即学习“Java免费学习笔记(深入)”;
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


















