LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。
目录
概 述
消息摘要算法
MD(Message Digest)消息摘要
SHA(Secure Hash Algorithm)安全散列
MAC(Message Authentication Code)消息认证码
它用于验证数据完整性,它是数字签名核心算法。
二、MD算法
2.1、JDK实现MD算法
1.使用JDK的MessageDigest类,使用该类的getInstance静态方法来获取一个MessageDigest实例,方法参数是算法名称。
2.使用MessageDigest的digest(byte[] b)方法,把指定内容通过MD5进行加密,返回字节数组类型。可以把返回的字节数组转换为16进制的形式显示(方便查看),借助CC的Hex类的encodeHexString(byte[] b)静态方法,把字节数组转为16进制字符串,或者使用BC的Hex类的toHexString(byte[] b)静态方法。
JDK实现MD2加密:
MessageDigest md=MessageDigest.getInstance(“MD2”);
byte [] b=md.digest(“test”.getBytes());
System.out.println(Hex.encodeHexString(b));
JDK实现MD5加密:
MessageDigest md=MessageDigest.getInstance(“MD5”);
byte [] b=md.digest("test ".getBytes());
System.out.println(Hex.encodeHexString(b));
2.2、BouncyCastle实现MD算法
1.使用BouncyCastle中的Digest接口,该接口有很多实现类,包括MD2Digest()、MD4Digest()、MD5Digest()、SHA等实例。根据使用加密算法的不同,自行选择对应的实现类。
2.调用Digest接口的update(byte[] b,inOff,len)方法进行加密,有三个参数,第一个参数是要加密的明文字节数组,第二个参数是从字节数组的哪里开始加密,第三个参数是要加密的长度。方法返回void。
3.调用Digest接口的doFinal(byte[] b,outOff)方法来获取经过加密后的密文。参数一是用来存放加密后信息的字节数组,参数二是从字节数组的哪里开始存放。方法返回void。
BouncyCastle实现MD4加密:
Digest digest=new MD4Digest();
digest.update(“test”.getBytes(),0," test ".getBytes().length);
byte [] b=new byte[digest.getDigestSize()];
digest.doFinal(b,0);
System.out.println(Hex.toHexString(b));
System.out.println(Hex.toHexString(b));
Security.addProvider(new BouncyCastleProvider());
MessageDigest md=MessageDigest.getInstance(“MD4”);
byte [] b=md.digest(“test”.getBytes());
System.out.println(Hex.encodeHexString(b));
//根据MessageDigest的getProvider()方法可以获取当前使用的算法的提供商,通过getName()打印出来,此时显示提供商为BC,如果使用MD2、MD5,则打印出来是SUN。
2.3、CommonCodec实现MD算法
CommonCodec提供了DigestUtils类,该类有getDigest(String algorithm)、getMd2Digest()、getMd5Digest()、getSha…方法等,返回一个MessageDigest实例。这个MessageDigest就是JDK提供的MessageDigest类。因此CommonCodec的MD算法实现实际是为了简化JDK MD算法实现的操作。
- 直接使用DigestUtils的md5Hex(byte [] b)静态方法,直接把字节数组通过MD5加密并且转换为16进制,返回字符串类型。还有md2Hex()以及其他算法的方法实现,没有md4Hex()。
CommonCodec实现MD2算法:
System.out.println(DigestUtils.md2Hex(“test”.getBytes()));
JDK实现SHA-224、SHA-256、SHA-384、SHA-512算法只要在getInstance()方法中换上对应的算法名即可。即:getInstance(SHA-224)、getInstance(SHA-256)。
3.2、BouncyCastle实现SHA1算法
仍然是使用Digest接口,换上对应算法的实现类。
Digest digest=new SHA1Digest();
digest.update(“test”.getBytes(),0,str.getBytes().length);
byte [] data=new byte[digest.getDigestSize()];
digest.doFinal(data,0);
BouncyCastle实现SHA-224、SHA-256、SHA-384、SHA-512算法,只需要给Digest接口注入对应算法的实现类即可。例:SHA224Digest()、SHA256Digest()…
3.3、CommonCodec实现SHA1算法
仍然使用DigestUtils工具类,有getXXX方法获取MessageDigest实例或XXXHex方法直接将指定内容通过摘要处理并转为16进制。
//方式一
DigestUtils.sha1Hex(str.getBytes()));
//方式二
MessageDigest digest=DigestUtils.getDigest(“SHA”);
byte[] data=digest.digest(str.getBytes());
Hex.encodeHexString(data);
//方式三
MessageDigest digest=DigestUtils.getSha1Digest();
byte[] data=digest.digest(str.getBytes());
Hex.encodeHexString(data);
CommonCodec实现SHA-224、SHA-256、SHA-384、SHA-512算法,只需使用算法对应的方法即可。参照JDK的实现方式。
3.4、SHA算法应用
四、MAC算法
MAC兼容了MD与SHA这两种的特性,并且在这个基础上添加了密钥。通常又把MAC称为HMAC,即含有密钥的散列函数算法。MD系列算法与SHA系列算法分别是两种不同形式的信息摘要算法,都是没有密钥的散列函数算法。 MAC算法则为MD与SHA系列算法的基础上添加了密钥,构成了新的算法。提供了:HmacMD2、HmacMD4、HmacMD5、HmacSHA1、HmacSHA224、HmacSHA356、HmacSHA384、HmacSHA512算法实现类。
4.1、JDK实现HmacMD5算法
//创建密钥生成器,指定算法名称.KeyGenerator keyGenerator = KeyGenerator.getInsatance(“HMacMD5”);//初始化密钥长度keyGenerator.init(128);//生成密钥对象SecretKey secretkey = keyGenerator.generateKey();//生成密钥byte[] key = secretKey.getEncoded();//还原密钥SecretKey restoreSecretKey = new SecretKeySpec(key, “HmacMD5”);//创建Mac实例.Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());//通过还原密钥初始化.mac.init(restoreSecretKey);//执行摘要操作byte[] hmacMD5Bytes = mac.doFinal(“test”.getBytes());System.out.println(Hex.encodeHexString(hmacMD5Bytes));
4.2、BouncyCastle实现HmacMD5算法
HMac hmac = new HMac(new MD5Digest());hmac.init(new KeyParameter((Hex.decode(“aaaaaaaa”)))); hmac.update(“test”.getBytes(), 0, “test”.length());byte[] hmacMD5Bytes = new byte[hmac.getMacSize()]; hmac.doFinal(hmacMD5Bytes,0); System.out.println(Hex.toHexString(hmacMD5Bytes));
4.3、MAC算法应用
`
# 小结
讲述了JAVA实现消息摘要算法加密的文章,不足之处请各位大佬指导。
# 参考资料和推荐阅读
1.链接: [参考资料](https://baijiahao.baidu.com/sid=1644445565096209075&wfr=spider&for=pc).