单向加密——JAVA消息摘要算法使用
来源:互联网 发布:怎么卖软件赚钱 编辑:程序博客网 时间:2024/06/08 15:05
在Java中使用MD、SHA、MAC三种消息摘要算法实现加解密。
1.MD
package com.imooc.security;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.Security;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import org.bouncycastle.crypto.Digest;import org.bouncycastle.crypto.digests.MD4Digest;import org.bouncycastle.crypto.digests.MD5Digest;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.junit.Test;public class ImoocMd { private String srcStr = "imooc security md"; /** * JDK实现MD5 */ @Test public void jdkMd5(){ try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md.digest(srcStr.getBytes()); //将byte数组转成16进制; String md5Str = Hex.encodeHexString(md5Bytes); System.out.println("JDK MD5:"+md5Str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * JDK实现MD2 */ @Test public void jdkMd2(){ try { MessageDigest md = MessageDigest.getInstance("MD2"); byte[] md2Bytes = md.digest(srcStr.getBytes()); //将byte数组转成16进制; String md2Str = Hex.encodeHexString(md2Bytes); System.out.println("JDK MD2:"+md2Str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * bc,md5 */ @Test public void bcMd5(){ Digest digest = new MD5Digest(); digest.update(srcStr.getBytes(), 0, srcStr.length()); byte[] md5Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md5Bytes, 0); String md5Str = org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes); System.out.println(" BC MD5:"+md5Str); } /** * bc,md4 */ @Test public void bcMd4(){ Digest digest = new MD4Digest(); digest.update(srcStr.getBytes(), 0, srcStr.length()); byte[] md4Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md4Bytes, 0); String md4Str = org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes); System.out.println(" BC MD4:"+md4Str); } /** * bc,md4:方法2 */ @Test public void bcMd42(){ try { Security.addProvider(new BouncyCastleProvider()); MessageDigest md = MessageDigest.getInstance("MD4"); byte[] md4Bytes = md.digest(srcStr.getBytes()); //将byte数组转成16进制; String md4Str = Hex.encodeHexString(md4Bytes); System.out.println("BC的MD4方法2:\n BC MD4:"+md4Str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * cc,md5 */ @Test public void ccMd5(){ String md5Str = DigestUtils.md5Hex(srcStr.getBytes()); System.out.println("CC MD5:"+md5Str); } /** * cc,md2 */ @Test public void ccMd2(){ String md2Str = DigestUtils.md2Hex(srcStr.getBytes()); System.out.println("CC MD2:"+md2Str); }}
结果:
BC的MD4方法2:
BC MD4:d4878ee1ed8379537813b3888320ad04
JDK MD2:54ade03d9765c9f0290189a2ae704ee7
JDK MD5:89048f19b72e7367b7faacfe659a8de0
BC MD4:d4878ee1ed8379537813b3888320ad04
BC MD5:89048f19b72e7367b7faacfe659a8de0
CC MD2:54ade03d9765c9f0290189a2ae704ee7
CC MD5:89048f19b72e7367b7faacfe659a8de0
2.SHA
package com.imooc.security;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.Security;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import org.bouncycastle.crypto.Digest;import org.bouncycastle.crypto.digests.SHA1Digest;import org.bouncycastle.crypto.digests.SHA224Digest;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.junit.Test;public class ImoocSha { private String srcStr = "imooc security sha"; /** * 自带,SHA1 */ @Test public void jdkSha1(){ try { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(srcStr.getBytes()); //将byte数组转成16进制; String sha1Str = Hex.encodeHexString(md.digest()); System.out.println("JDK SHA1:"+sha1Str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * BC SHA1的方法 */ @Test public void bcSha1(){ Digest digest = new SHA1Digest(); digest.update(srcStr.getBytes(), 0, srcStr.getBytes().length); byte[] sha1Bytes = new byte[digest.getDigestSize()]; digest.doFinal(sha1Bytes, 0); //将byte数组转成16进制; String sha1Str = org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes); System.out.println(" BC SHA1:"+sha1Str); } /** * BC SHA2:SHA224的方法 */ @Test public void bcSha224(){ Digest digest = new SHA224Digest(); digest.update(srcStr.getBytes(), 0, srcStr.getBytes().length); byte[] sha224Bytes = new byte[digest.getDigestSize()]; digest.doFinal(sha224Bytes, 0); //将byte数组转成16进制; String sha224Str = org.bouncycastle.util.encoders.Hex.toHexString(sha224Bytes); System.out.println(" BC SHA224:"+sha224Str); } /** * BC SHA2:SHA224的方法 */ @Test public void bcSha224_2(){ try { Security.addProvider(new BouncyCastleProvider()); MessageDigest md = MessageDigest.getInstance("SHA224"); md.update(srcStr.getBytes()); //将byte数组转成16进制; String sha224Str = Hex.encodeHexString(md.digest()); System.out.println("方法二: BC SHA224:"+sha224Str); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * CC SHA1: */ @Test public void ccSha1(){ String sha1 = DigestUtils.sha1Hex(srcStr.getBytes()); System.out.println("方法一: CC SHA1:"+sha1); sha1 = DigestUtils.sha1Hex(srcStr); System.out.println("方法二: CC SHA1:"+sha1); }}
结果:
JDK SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
BC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
方法二: BC SHA224:0b71cc6f590e1d026c922a99081a14e2c58818f4047dae6db3cf3d67
方法一: CC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
方法二: CC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
BC SHA224:0b71cc6f590e1d026c922a99081a14e2c58818f4047dae6db3cf3d67
3.MAC
package com.imooc.security;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.DecoderException;import org.apache.commons.codec.binary.Hex;import org.bouncycastle.crypto.Digest;import org.bouncycastle.crypto.digests.MD5Digest;import org.bouncycastle.crypto.macs.HMac;import org.bouncycastle.crypto.params.KeyParameter;import org.junit.Test;public class ImoocHmac { private String srcStr = "imooc security hmac"; /** * JDK hmac消息摘要算法; */ @Test public void jdkHmacMD5(){ try { //初始化KeyGenerator; KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); //产生密钥; SecretKey secretKey = keyGenerator.generateKey(); //获得密钥 //byte[] key = secretKey.getEncoded(); //设置密钥; byte[] key = Hex.decodeHex(new char[]{'a','a','a','a','a','a','a','a','a','a'}); //还原密钥 SecretKey restoreSecretKey = new SecretKeySpec(key,"HmacMD5"); //实例化MAC Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm()); //初始化Mac mac.init(restoreSecretKey); //执行摘要; byte[] hmacMD5Bytes = mac.doFinal(srcStr.getBytes()); //转成16进制字符串 String hmacStr = Hex.encodeHexString(hmacMD5Bytes); System.out.println("JDK hmacMD5:"+hmacStr); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } } /** * bc的hmac算法应用 */ @Test public void bcHmacMD5(){ Digest digest = new MD5Digest(); HMac hmac = new HMac(digest); byte[] initHexStr = org.bouncycastle.util.encoders.Hex.decode("aaaaaaaaaa"); //初始化Mac; hmac.init(new KeyParameter(initHexStr)); //更新Mac; hmac.update(srcStr.getBytes(), 0, srcStr.getBytes().length); //预设置摘要结果; byte[] hmacMD5Bytes = new byte[hmac.getMacSize()]; hmac.doFinal(hmacMD5Bytes, 0); //将byte数组转成16进制; String hmacStr = org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes); System.out.println(" BC hmacMD5:"+hmacStr); }}
结果:
BC hmacMD5:522b5217700cdcedd73f19bd67bad599
JDK hmacMD5:522b5217700cdcedd73f19bd67bad599
- 单向加密——JAVA消息摘要算法使用
- java消息摘要算法加密
- java消息摘要算法加密
- java消息摘要算法加密
- Java消息摘要算法加密
- 单向加密——使用java加密Base64算法
- Java加密-Base64、消息摘要算法
- java 加密之消息摘要算法
- 消息摘要算法加密
- 密码学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
- 密码学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
- Java加密系列之(三)消息摘要算法加密
- java加密解密研究5、消息摘要算法简介
- java加密解密研究9、其他消息摘要算法
- Java加密与解密的艺术-消息摘要算法
- JAVA加密解密之消息摘要算法(MessageDigest)
- Java加密与解密学习记录03-消息摘要算法
- Java消息摘要算法
- spring@transactional事物回滚
- 查找系统定义size_t , va_list , va_start , va_end 等不常见宏(变量)头文件所在
- Vue2集成AdminLte 后台模板
- Java中常用的for循环
- 1005. Spell It Right (20)
- 单向加密——JAVA消息摘要算法使用
- scipy在图像中的读取和保存图片功能
- Paint之setColorFilter(二)
- 项目启动错误--搭建图片服务器
- 单例模式
- 移动订单ERP接口
- leetcode 44. Wildcard Matching
- 并查集模板
- urllib与requests的对比