参考慕课的加密视频上面的代码:http://www.imooc.com/learn/285
学习security应用与算法如下:
* 1.Base64算法 * 2.消息摘要算法 * 3.对称加密算法 * 4.非对称加密算法 * 5.数字签名算法 * 6.数字证书 * 7.安全协议1.创建一个maven项目,可以参考一下百度:http://jingyan.baidu.com/article/ea24bc39b1a8c7da63b33159.html
2.pom.xml文件进行如下配置:
<PRoject xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.samlai</groupId> <artifactId>security</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>security</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.45</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <!-- 不知道为什么引入jdk的base64Decoder,所以要添加jdk中jre的rt.jar,进行pom引入本地文件 --> <dependency> <groupId>com.samlai</groupId> <artifactId>my-tools</artifactId> <version>2.5.0</version> <type>jar</type> <scope>system</scope> <systemPath>${basedir}/lib/rt.jar</systemPath> </dependency> </dependencies></project>4.直接在project写对应的Base64的class类:package com.samlai.security;import java.io.IOException;import org.apache.commons.codec.binary.Base64;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;//Base64算法//应用:证书,密钥,emailpublic class Base64Study { /** * 加密应用: * 1.Base64算法 * 2.消息摘要算法 * 3.对称加密算法 * 4.非对称加密算法 * 5.数字签名算法 * 6.数字证书 * 7.安全协议 * * 3种方式进行加密解密处理: * 1.原生的JDK方式 * 2.Bouncy Castle * -两种支持方案:A.配置 2.调用 * 3.Commons Codec * -Apache * -Base64,二进制,十六进制,字符集编码 * -Url编码/解码 */ private static String STR="one type of security:Base64"; public static void main(String[] args) { //JDK方式实现 jdkDoBase64(); //CC实现的方式 commonsCodecBase64(); //BC实现的方式 bouncyCastleBase64(); } //JDK方式实现 public static void jdkDoBase64(){ try { BASE64Encoder encoder=new BASE64Encoder(); String encode=encoder.encode(STR.getBytes()); System.out.println("jdk encode: "+encode); BASE64Decoder decoder=new BASE64Decoder(); System.out.println("jdk decode: "+new String(decoder.decodeBuffer(encode))); } catch (IOException e) { e.printStackTrace(); } } //Commons Codec方式实现 public static void commonsCodecBase64(){ byte[] encodeBytes=Base64.encodeBase64(STR.getBytes()); System.out.println("cc encode: "+new String(encodeBytes)); byte[] decodeBytes=Base64.decodeBase64(encodeBytes); System.out.println("cc decode: "+new String(decodeBytes)); } //Bouncy Castle方式实现 public static void bouncyCastleBase64(){ byte[] encodeBytes=org.bouncycastle.util.encoders.Base64.encode(STR.getBytes()); System.out.println("bc encode: "+new String(encodeBytes)); byte[] decodeBytes=org.bouncycastle.util.encoders.Base64.decode(encodeBytes); System.out.println("bc decode: "+new String(decodeBytes)); } }运行的结果是:
jdk encode: b25lIHR5cGUgb2Ygc2VjdXJpdHk6QmFzZTY0jdk decode: one type of security:Base64cc encode: b25lIHR5cGUgb2Ygc2VjdXJpdHk6QmFzZTY0cc decode: one type of security:Base64bc encode: b25lIHR5cGUgb2Ygc2VjdXJpdHk6QmFzZTY0bc decode: one type of security:Base645.新建消息摘要算法-MD,以Jdk,bc,cc方式来进行实现
package com.samlai.security;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import org.apache.commons.codec.binary.Hex;import org.apache.commons.codec.digest.DigestUtils;import org.bouncycastle.crypto.Digest;import org.bouncycastle.crypto.digests.MD2Digest;import org.bouncycastle.crypto.digests.MD4Digest;import org.bouncycastle.crypto.digests.md5Digest;//消息摘要算法public class MessageDigestStudy { /** * MD(Message Digest) * MD家族(128位摘要信息) -MD2,MD4 * 类型: * 算法 长度 实现方 * MD2-128位-JDK * MD4-128位-Boundcy Castle * MD5-128位-JDK * * SHA(Secure Hash Algorithm) MAC(Message Authentication Code) 验证数据的完整性 * 数字签名核心算法 */ private static String STR = "one type of security:MD-X"; public static void main(String[] args) { jdkMd5(); jdkMd2(); bcMd4(); bcMd2(); bcMd5(); ccMd5(); ccMd2(); } // jdkMd5 public static void jdkMd5() { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md.digest(STR.getBytes()); // 借助cc的算法来进行md5的加密出对应的字符串 System.out.println("JDK MD5: " + Hex.encodeHexString(md5Bytes)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } // jdkMd2 public static void jdkMd2() { try { MessageDigest md = MessageDigest.getInstance("MD2"); byte[] md5Bytes = md.digest(STR.getBytes()); // 借助cc的算法来进行md2的加密出对应的字符串 System.out.println("JDK MD2: " + Hex.encodeHexString(md5Bytes)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } // bcMd4 public static void bcMd4() { Digest digest = new MD4Digest(); digest.update(STR.getBytes(), 0, STR.getBytes().length); byte[] md4Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md4Bytes, 0); System.out.println("bc Md4: " + Hex.encodeHexString(md4Bytes)); } // bcMd2 public static void bcMd2() { Digest digest = new MD2Digest(); digest.update(STR.getBytes(), 0, STR.getBytes().length); byte[] md4Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md4Bytes, 0); System.out.println("bc Md2: " + Hex.encodeHexString(md4Bytes)); } // bcMd5 public static void bcMd5() { Digest digest = new MD5Digest(); digest.update(STR.getBytes(), 0, STR.getBytes().length); byte[] md4Bytes = new byte[digest.getDigestSize()]; digest.doFinal(md4Bytes, 0); System.out.println("bc Md5: " + Hex.encodeHexString(md4Bytes)); } // ccMD5 public static void ccMd5() { System.out.println("CC MD5: " + DigestUtils.md5Hex(STR.getBytes())); } // ccMD2 public static void ccMd2() { System.out.println("CC MD2: " + DigestUtils.md2Hex(STR.getBytes())); }}运行的结果如下:
JDK MD5: 124a5c93d2b8d49e96f3e62aa758af78JDK MD2: 5f35106ba9b40d343bd33ee777e15bdabc Md4: 2182747909e25a336d8928bd4c5b7f31bc Md2: 5f35106ba9b40d343bd33ee777e15bdabc Md5: 124a5c93d2b8d49e96f3e62aa758af78CC MD5: 124a5c93d2b8d49e96f3e62aa758af78CC MD2: 5f35106ba9b40d343bd33ee777e15bda6.新建消息摘要算法-SHA,以Jdk,bc,cc方式来进行实现:
package com.samlai.security;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;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;public class SHAMessageDigestStudy { /** * 消息摘要算法--SHA * 安全散列算法 * SHA-1,SHA-2(SHA-224,SHA-256,SHA-384,SHA-512) * 算法 摘要长度 实现方 * SHA-1 160 JDK * SHA-224 224 Bouncy Castle * SHA-256 256 JDK * SHA-384 384 JDK * SHA-512 512 JDK */ private static String STR = "one type of security:SH-X"; public static void main(String[] args) { jdkSHA1(); bcSHA1(); bcSHA224(); ccSHA1(); } //Jdk的SHA1算法 public static void jdkSHA1() { try { MessageDigest md=MessageDigest.getInstance("SHA"); md.update(STR.getBytes()); System.out.println("jdk sha-1:"+Hex.encodeHexString(md.digest())); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } //bc的SHA1算法 public static void bcSHA1() { Digest digest=new SHA1Digest(); digest.update(STR.getBytes(),0,STR.getBytes().length); byte[] sha1Bytes=new byte[digest.getDigestSize()]; digest.doFinal(sha1Bytes, 0); System.out.println("bc SHA-1: "+Hex.encodeHexString(sha1Bytes)); } //bc的SHA224算法 public static void bcSHA224() { Digest digest=new SHA224Digest(); digest.update(STR.getBytes(),0,STR.getBytes().length); byte[] sha1Bytes=new byte[digest.getDigestSize()]; digest.doFinal(sha1Bytes, 0); System.out.println("bc SHA-224: "+Hex.encodeHexString(sha1Bytes)); } //cc的SHA1算法 public static void ccSHA1(){ System.out.println("cc SHA1 1: "+DigestUtils.sha1Hex(STR.getBytes())); System.out.println("cc SHA1 2: "+DigestUtils.sha1Hex(STR)); } }运行的结果如下:jdk sha-1:6f1f5458f87160e40de37b632c9f202521c38069bc SHA-1: 6f1f5458f87160e40de37b632c9f202521c38069bc SHA-224: 8809029976d18ef9564042591b9e02401d7fec17cece03f43b6e886acc SHA1 1: 6f1f5458f87160e40de37b632c9f202521c38069cc SHA1 2: 6f1f5458f87160e40de37b632c9f202521c38069
7.新建消息摘要算法-MAC,以Jdk,bc实现:
package com.samlai.security;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.binary.Hex;import org.bouncycastle.crypto.digests.MD5Digest;import org.bouncycastle.crypto.macs.HMac;import org.bouncycastle.crypto.params.KeyParameter;import org.omg.IOP.Encoding;//消息摘要算法-MACpublic class MACMessageDigest { /** * MAC:Message Authentication Code * 含有密钥的散列函数算法 * 融合MD,SHA * -MD系列:HMACMD2,HmacMd4,HmacMd5 * -SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512 * 应用如:SecureCRT */ private static String STR = "one type of security:MAC"; public static void main(String[] args) { jdkHmacMd5(); bcHmacMd5(); } //jdk hmac public static 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'}); //还原密钥 SecretKey restoreSecretKey=new SecretKeySpec(key, "HmacMD5"); //实例化MAC Mac mac=Mac.getInstance(restoreSecretKey.getAlgorithm()); //初始化Mac mac.init(restoreSecretKey); //执行摘要 byte[] hmacMD5Bytes=mac.doFinal(STR.getBytes()); System.out.println("jdk HmacMD5:"+Hex.encodeHexString(hmacMD5Bytes)); } catch (Exception e) { e.printStackTrace(); } } //bc hmac public static void bcHmacMd5(){ HMac hMac=new HMac(new MD5Digest()); hMac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("aaaaaaaa"))); hMac.update(STR.getBytes(),0,STR.getBytes().length); //执行摘要 byte[] hmacMD5bytes=new byte[hMac.getMacSize()]; hMac.doFinal(hmacMD5bytes, 0); System.out.println("bc HmacMD5:"+Hex.encodeHexString(hmacMD5bytes)); } }
新闻热点
疑难解答