Java MessageDigest 类

信息摘要算法常用的有 MD5、SHA-1、SHA-256,Java 提供了 java.security.MessageDigest 类来帮助我们进行数据校验。

MessageDigest 介绍

哈希算法、加密算法的区别
哈希算法是不可逆的,你只能从数据得到哈希,不能从哈希得到数据,主要用来进行数据校验;
加密算法是可逆的,从明文到密文叫做加密,从密文到明文叫做解密,主要用来保护数据安全。

MessageDigest 摘要算法
MessageDigest 是抽象类,通过其 getInstance(String algo) 方法获取对应摘要算法的实例,摘要算法有:

  • MD2
  • MD5
  • SHA-1
  • SHA-224
  • SHA-256
  • SHA-384
  • SHA-512

MessageDigest 常用方法
static MessageDigest getInstance(String algorithm):获取对应实例
String getAlgorithm():摘要算法的名称
int getDigestLength():摘要数据的长度(字节)
void update(byte input):使用指定字节更新摘要
void update(byte[] input):使用指定字节数组更新摘要
void update(byte[] input, int offset, int length):使用指定字节数组更新摘要
void update(ByteBuffer input):使用指定字节缓冲器更新摘要
byte[] digest():计算摘要,返回字节数组
byte[] digest(byte[] input):计算摘要,返回字节数组
int digest(byte[] buf, int offset, int length):计算摘要,返回字节数组
void reset():重置摘要,以便计算下份数据

MessageDigest 例子

因为 digest() 方法返回的是字节数组,不是我们平常使用的十六进制字符串,所以需要进行转换。转换方法:

注:由于 Prism.JS 语法高亮插件的 bug,导致 %02x 无法正常显示(但复制没问题),下同,不要在意。

一个字节等于两个十六进制数字,0xFF 等于 0B11111111(8 bit = 1 byte),%02x 将每个字节转换为两个长度的十六进制数字,不足的补零。

这里提供一个摘要算法工具类 com.zfl9.DigestUtils(用法很简单,就不介绍了):