哈希算法又称作消息摘要算法,它的目的就是为了验证原始数据是否被篡改并且它只能进行加密而无法解密。我们常见的哈希算法有:MD5、SHA-1、SHA-256、SHA-512以及第三方开源库给我们提供的一些哈希算法、以及基于哈希算法的HMac算法,例如RipeMD160,它们的输出长度如下:
我们以获取图片的MD5值为例,看看如何输入计算哈希:
1、通过IO流拿到图片的字节数组
2、获取基于MD5加密算法的工具对象
3、更新原始内容
4、对数据进行加密
5、将加密后的字节数组转换为字符串
public class Demo08 {
public static void main(String[] args) {
// 获取图片的MD5值
try {
byte[] imgByteArray = Files.readAllBytes(Paths.get("D:\\IOTest\\doubanPicture\\jay.jpg"));
// 获取基于MD5加密算法的工具对象
MessageDigest digest = MessageDigest.getInstance("MD5");
// 更新原始数据
digest.update(imgByteArray);
// 加密
byte[] resByteArray = digest.digest();
// 加密后的字节数组,转换为字符串
StringBuilder sb = new StringBuilder();
for (byte b : resByteArray) {
sb.append(String.format("%02x", b));
}
System.out.println(sb);
System.out.println(sb.length());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果如下:
字符串长度为32的原因是无论你要加密的内容是什么, 最后的输出长度都会像上图提到的输出长度一样,像MD5最终的输出长度为16字节,因为我将字节数组转换为了字符串,所以它的长度就变为了32。
其他的SHA-1、SHA-256等等,基本与MD5类似,不同的只是在获取加密算法的工具对象时,传进去的值不同而已。
Hmac算法就是一种基于密钥的消息认证码算法,它是一种更安全的消息摘要算法,在存储用户的口令时,通过加"盐"的方式可以抵御彩虹表的攻击,而这个"salt"就相当于Hmac算法里的认证码这也是Hmac算法的一个优势,一般情况下,Hmac算法总是和某种哈希算法配合起来使用的,而且输出的长度也和所配合的这种哈希算法长度一致。
我们以HmacSHA1算法为例,看看如何输入计算哈希:
1、创建密钥生成器对象KeyGenerator
2、根据密钥生成器生成密钥
3、获取算法对象Mac
4、初始化密钥
5、更新原始内容
6、加密
7、输出结果
public class Demo11 {
public static void main(String[] args) {
String psw = "Apesource";
try {
// 1.生成秘钥
// 秘钥生成器KeyGenerator
KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA1");
// 生成秘钥
SecretKey key = keyGen.generateKey();
// 2.使用秘钥,进行加密
// 获取算法对象
Mac mac = Mac.getInstance("HmacSHA1");
// 初始化秘钥
mac.init(key);
// 更新原始内容
mac.update(psw.getBytes());
// 加密
byte[] resByteArray = mac.doFinal();
StringBuilder res = new StringBuilder();
for (byte b : resByteArray) {
res.append(String.format("%02x", b));
}
System.out.println(res);
System.out.println(res.length());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
}
结果如下:
最终Hmac的输出字节数组长度为20字节,转换为字符串为40字节。