java 消息摘要_JAVA实现消息摘要算法加密

一、概述

消息摘要算法

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));

//getDisgestSize()方法可以获取经过加密后摘要的长度。

//MD4的使用与MD2、MD5的方式类似,换成对应算法的实现类即可。

使用JDK的Security类的addProvider(Provider p)静态方法,可以为JDK添加新的算法提供商,因为JDK没有为MD4提供算法实现,BC有提供,所以可以通过配置或者使用addProvider方法把BC算法提供商动态的添加到JDK中,JDK就可以使用到BC提供的算法实现,此时再使用MessageDigest.getInstance("MD4")方法就不会报错。

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算法实现的操作。

1. 直接使用DigestUtils的md5Hex(byte [] b)静态方法,直接把字节数组通过MD5加密并且转换为16进制,返回字符串类型。还有md2Hex()以及其他算法的方法实现,没有md4Hex()。

CommonCodec实现MD2算法:

System.out.println(DigestUtils.md2Hex("test".getBytes()));

CommonCodec实现MD5算法:

System.out.println(DigestUtils.md5Hex("test ".getBytes()));

在MD系列中,CC与BC区别比较大,CC MD系列的方法只是为了简便JDK实现MD算法的操作,减少代码量,而BC则是自己独立的操作,并且提供MD4算法。实际上,CommonCodec所有算法实现都是为了简化jdk的操作。BouncyCastle是为了做额外的补充。

2.4、MD算法应用

cd35c4c826cc443986d5463f92857d7b.png

三、SHA算法

eafff284b1247865ad567fb3ee8891d4.png

3.1、JDK实现SHA1算法

仍然是使用MessageDigest类,与MD实现方法一致。

//在jdk中,getInstance("SHA")即为SHA-1,SHA-1的名称就是SHA。

MessageDigest digest=MessageDigest.getInstance("SHA");

byte [] data=digest.digest("test".getBytes());

Hex.encodeHexString(data);

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);

System.out.println("BouncyCastle SHA-1 "+Hex.toHexString(data));

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算法应用

73a3561f3822337a0b2cfb9dbf105b49.png

四、MAC算法

MAC兼容了MD与SHA这两种的特性,并且在这个基础上添加了密钥。通常又把MAC称为HMAC,即含有密钥的散列函数算法。MD系列算法与SHA系列算法分别是两种不同形式的信息摘要算法,都是没有密钥的散列函数算法。 MAC算法则为MD与SHA系列算法的基础上添加了密钥,构成了新的算法。提供了:HmacMD2、HmacMD4、HmacMD5、HmacSHA1、HmacSHA224、HmacSHA356、HmacSHA384、HmacSHA512算法实现类。

cc203868c497b1623efef5c79bd0077f.png

4.1、JDK实现HmacMD5算法

//创建密钥生成器,指定算法名称.KeyGenerator keyGenerator = KeyGenerator.getInsatance("HMacMD5");//初始化密钥长度keyGenerator.init(128);//生成密钥对象SecretKey secretkey = keyGenerator.generateKey();//生成密钥byte[] key = secretKey.getEncoded();//还原密钥SecretKey restoreSecretKey = newSecretKeySpec(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 = newHMac(newMD5Digest());hmac.init(newKeyParameter((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算法应用

cee0d748a039cbb85d573a91e2243d71.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值