哈希算法(Hash)之二

2021-12-07  本文已影响0人  喏喏2021

1. 概念

2. 常用算法及长度

MD5 128 bits
SHA-1 160 bits
RipeMD-160 160 bits
SHA-256 256 bits
SHA-512 512 bits

3. 用途

4. 代码示例

import java.security.MessageDigest;
MessageDigest md = MessageDigest.getInstance("MD5");
String input = "123456";
md.update(input.getBytes("UTF-8"));
byte[] result = md.digest();
System.out.println(new BigInteger(1,result).toString(16)); //按字节挨个输出16进制字符
//e10adc3949ba59abbe56e057f20f883e
MessageDigest md = MessageDigest.getInstance("SHA-256");  //只是调整了算法名,最终我们得到的结果如下
//8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

有些哈希算法可能JDK自带的没有,这时我们可以引入第三方库,如bouncycastle
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.65</version>
</dependency>
这样,代码中添加一下算法,就可以体验其它哈希算法了,很棒!

Security.addProvider(new BouncyCastleProvider());
MessageDigest md = MessageDigest.getInstance("RipeMD160"); //同样是123456,用RipeMD160加密后就是如下的输出
//d8913df37b24c97f28f840114d05bd110dbb2e44

5. Hmac算法

  1. 生成key
import javax.crypto.KeyGenerator;
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5"); //生成KeyGenerator
SecretKey key = keyGen.generateKey(); //生成key
byte[] skeys = key.getEncoded(); //获得key的字节数组
String keyStr = new BigInteger(1,skeys).toString(16); //方便打印查看
System.out.println(keyStr);
//919bfbaa38011cb1e696b6c99ddb61fbd06036478d2be176503efd6e0ba120260c240f675663bfe24ad003533b8e284d0294b7f8c2e6696157cce66b3cfe367e
  1. 用hmacMD5加密
Mac mac = Mac.getInstance("HmacMD5");
mac.init(key); //使用前面生成key,初始化
mac.update("hello".getBytes());
byte[] resultData = mac.doFinal(); //加密,得到结果字节数组
String result = new BigInteger(1,resultData).toString(16); //加密后内容输出
System.out.println(result); 
//a28fbd6a086ce428dc26380a7aab1cc8
  1. 用hmacMD5对数据验证
SecretKey key1 = new SecretKeySpec(skeys,"HmacMD5"); //这里使用前面生成的key数组
Mac mac1 = Mac.getInstance("HmacMD5");
mac1.init(key1);
mac1.update("hello".getBytes());
byte[] resultData1 = mac1.doFinal(); //得到实际验证的加密数组
String result1 = new BigInteger(1,resultData1).toString(16);  //输出查看,当然和前面的输出是一样的
System.out.println(result1);
//a28fbd6a086ce428dc26380a7aab1cc8

注:验证的时候,我们一般需要从库中读取出keys值,用密码原文+keys值,计算出验证密文,方便和已保存的密文进行比较
遗留问题:库中一般保存的是16进制的字符,大家有没有好的工具方法,将16进制字符串,转为需要的字符数组,将2位16进制字符转为1个字节?
欢迎留言,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读