java md5加密解密_Java加密与解密之消息摘要算法2

上一篇介绍了MD及SHA,接下来我们来说说MAC算法。MAC只要就是加入了密钥。

上一篇:Java加密与解密之消息摘要算法

MAC:Message Authentication Code,消息认证码算法。

MAC算法结合了MD5和SHA算法的优势,加入了密钥的支持,是一种更加安全的消息摘要算法。

MAC兼容了MD和SHA算法的特性,并在此基础上加入了密钥, 因为MAC算法融合了密钥散列函数通常我们也把MAC称为HMAC(keyd-Hash Message Authentication Code)。

MD系列:HmacMD2,HmacMD4,HmacMD5三种算法;

SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512五种算法。

HMAC生成的摘要信息长度与使用的MD或是SHA是对应的。如:HmacSHA256使用这个算法那生成的摘要信息长度就是256个字节。

JDK8支持的算法:

HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512


HmacMD2,HmacMD4,HmacSHA224这三种不支持,只用使用第三方库BC(Bouncy Castle)

代码示例:

9f17fea4c020c0a6cd1a0e837e354d70.png

初始化生成密钥

92c9fe26ab65f141e20228036eafa977.png

通过密钥生成摘要数据

bb8d31391c290ef20637be80cb83c9fe.png

测试

package com.pack.security.mac;import java.nio.charset.Charset;import java.util.Base64;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class HmacSHA1 {// 算法private static final String ALGORITHM = "HmacSHA1" ;/** *

* 初始化HmacSHA1密钥 *

*2020年10月8日 下午2:55:38 *@author xg *@return byte[] 生成的密钥信息 *@throws Exception */public static byte[] initHmacSHA1Key() throws Exception{// 初始化KeyGenerator密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM) ;// 产生密钥SecretKey secretKey = keyGenerator.generateKey() ;// 获取密钥return secretKey.getEncoded() ;}/** *

* HmacSHA1 消息摘要 *

*@author xg *@param data 要加密的数据 *@param key 密钥信息 * @return byte[] 摘要信息 *@throws Exception */public static byte[] encodeHmacSHA1(byte[] data, byte[] key) throws Exception {// 还原密钥SecretKey secretKey = new SecretKeySpec(key, ALGORITHM) ;// 实例化MACMac mac = Mac.getInstance(secretKey.getAlgorithm()) ;// 初始化macmac.init(secretKey) ;// 返回消息摘要return mac.doFinal(data) ;}public static String hex(byte[] digest) {StringBuilder sb = new StringBuilder() ;for (byte b : digest) {String str = Integer.toHexString(b & 0xff) ;if (str.length() < 2) {sb.append("0" + str) ;} else {sb.append(str) ;}}return sb.toString() ;}public static void main(String[] args) throws Exception {String message = "我是HmacSHA1算法" ;byte[] key1 = initHmacSHA1Key() ;String strKey1 = Base64.getEncoder().encodeToString(key1) ;byte[] messageDigest1 = encodeHmacSHA1(message.getBytes(Charset.forName("UTF-8")), key1) ;String strDigest1 = hex(messageDigest1) ;System.out.println(strDigest1) ;byte[] key2 = Base64.getDecoder().decode(strKey1.getBytes()) ;byte[] messageDigest2 = encodeHmacSHA1(message.getBytes(Charset.forName("UTF-8")), key2) ;String strDigest2 = hex(messageDigest2) ;System.out.println(strDigest2) ;System.out.println(strDigest1.equals(strDigest2)) ;}}

笔者曾经在一个项目中使用过该算法。当时是有很多的厂商要和我们系统对接,为了安全我们给每一个厂商提供一个密钥,然后厂商按照我们的约定对所有的入参进行签名,我们系统进行安全验证。

其它的算法这里就不演示了,针对自己使用的JDK版本看是否支持你所需要的算法即可,基本上BC支持了我们熟知的所有加解密算法。

到此我们对消息摘要算法进行了简单的介绍和使用。后续还会对对称加密和非对称加密及数字签名算法进行介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值