信息摘要算法常用的有 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(用法很简单,就不介绍了):