2.1、算法基本规则:
Base64算法公开、密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作。
注意:具体的算法与密钥(对于Base64来讲,是一张字符映射表)可在《Java加密与解密的艺术(第2版)》第5章“电子邮件传输算法--Base64”中查看
2.2、应用场景
通常,我们使用Base64最多的情况就是存储密钥。
2.3、Base64实现方式
实现方式有三种:
其中,最推荐使用Commons Codec。
注意:cc与bc的版本号,还有我实在jdk1.6下边调的
2.3.1、基于CC实现的Base64加解密
第一步:加入jar
第二步:编写代码
1 package com.util.base64; 2 3 import java.io.UnsupportedEncodingException; 4 import org.apache.commons.codec.binary.Base64; 5 6 /** 7 * 基于Commons Codec的Base64加密 8 */ 9 public class Base64CoderCC { 10 private static final String ENCODING = "UTF-8"; 11 12 /** 13 * 一般Base64加密 14 */ 15 public static String encode(String data) throws UnsupportedEncodingException{ 16 byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING)); 17 return new String(encodedByte, ENCODING); 18 } 19 20 /** 21 * 安全Base64加密 22 */ 23 public static String encodeSafe(String data) throws UnsupportedEncodingException{ 24 /* 25 * 注意:这里采用的encodeBase64(byte[] bytes, boolean arg1) 26 * arg1为true时,加密后的字符串每行为76个字符,不论每行够不够76个字符,都要在行尾添加“\r\n” 27 */ 28 byte[] encodedByte = Base64.encodeBase64(data.getBytes(ENCODING),true); 29 return new String(encodedByte, ENCODING); 30 } 31 32 /** 33 * Base64解密 34 */ 35 public static String decode(String data) throws UnsupportedEncodingException{ 36 byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING)); 37 return new String(decodedByte, ENCODING); 38 } 39 40 /** 41 * 测试 42 * @param args 43 * @throws UnsupportedEncodingException 44 */ 45 public static void main(String[] args) throws UnsupportedEncodingException { 46 /********************测试一般encode*********************/ 47 String data = "找一个好姑娘做老婆是我的梦 想!"; 48 System.out.println("原文-->"+data); 49 String encodedStr = Base64CoderCC.encode(data); 50 System.out.println("加密后-->"+encodedStr); 51 String decodedStr = Base64CoderCC.decode(encodedStr); 52 System.out.println("解密后-->"+decodedStr); 53 System.out.println(data.equals(decodedStr)); 54 System.out.println("================================"); 55 /********************测试安全encode*********************/ 56 String data2 = "找一个好姑娘做老婆是我的梦 想!找一个好姑娘做老婆是我的梦 想!"; 57 System.out.println("原文-->"+data2); 58 String encodedStr2 = Base64CoderCC.encodeSafe(data2); 59 System.out.println("加密后-->"+encodedStr2); 60 String decodedStr2 = Base64CoderCC.decode(encodedStr2); 61 System.out.println("解密后-->"+decodedStr2); 62 System.out.println(data2.equals(decodedStr2)); 63 } 64 }
第三步:测试
上述代码的main()方法。
测试结果:
注意:可以采用debug断点调试来查看每一个变量的值来验证上边的情况。
2.3.2、基于BC实现的Base64加解密算法
对于BC来讲,只有一般Base64加密算法,jar包以及简要代码如下:
1 package com.util.base64; 2 3 import java.io.UnsupportedEncodingException; 4 5 import org.bouncycastle.util.encoders.Base64; 6 7 /** 8 * 基于Bouncy Castle的Base64加密 9 */ 10 public class Base64CoderBC { 11 private static final String ENCODING = "UTF-8"; 12 13 /** 14 * Base64加密 15 */ 16 public static String encode(String data) throws UnsupportedEncodingException{ 17 byte[] encodedByte = Base64.encode(data.getBytes(ENCODING)); 18 return new String(encodedByte, ENCODING); 19 } 20 21 /** 22 * Base64解密 23 */ 24 public static String decode(String data) throws UnsupportedEncodingException{ 25 byte[] decodedByte = Base64.decode(data.getBytes(ENCODING)); 26 return new String(decodedByte, ENCODING); 27 } 28 29 /** 30 * 测试 31 * @param args 32 * @throws UnsupportedEncodingException 33 */ 34 public static void main(String[] args) throws UnsupportedEncodingException { 35 String data = " 找一个好姑娘做老婆是我的梦 想! "; 36 System.out.println("原文-->"+data); 37 String encodedStr = Base64CoderBC.encode(data); 38 System.out.println("加密后-->"+encodedStr); 39 String decodedStr = Base64CoderBC.decode(encodedStr); 40 System.out.println("解密后-->"+decodedStr); 41 System.out.println(data.equals(decodedStr)); 42 } 43 }
2.4、URLBase64实现方式
一般来讲这种算法仅用于使用get方式传递私密数据和以get方式传递二进制数据。
2.4.1、基于CC实现URLBase64
1 package com.util.base64; 2 3 import java.io.UnsupportedEncodingException; 4 import org.apache.commons.codec.binary.Base64; 5 /** 6 * 基于Commons Codec的URLBase64加密 7 */ 8 public class URLBase64CoderCC { 9 private static final String ENCODING = "UTF-8"; 10 /** 11 * URLBase64加密 12 */ 13 public static String encode(String data) throws UnsupportedEncodingException{ 14 byte[] encodedByte = Base64.encodeBase64URLSafe(data.getBytes(ENCODING)); 15 return new String(encodedByte, ENCODING); 16 } 17 /** 18 * URLBase64解密 19 */ 20 public static String decode(String data) throws UnsupportedEncodingException{ 21 byte[] decodedByte = Base64.decodeBase64(data.getBytes(ENCODING)); 22 return new String(decodedByte, ENCODING); 23 } 24 25 /** 26 * 测试 27 * @param args 28 * @throws UnsupportedEncodingException 29 */ 30 public static void main(String[] args) throws UnsupportedEncodingException { 31 String data = "找一个好姑娘做老婆是我的梦 想!"; 32 System.out.println("原文-->"+data); 33 String encodedStr = URLBase64CoderCC.encode(data); 34 System.out.println("加密后-->"+encodedStr); 35 String decodedStr = URLBase64CoderCC.decode(encodedStr); 36 System.out.println("解密后-->"+decodedStr); 37 System.out.println(data.equals(decodedStr)); 38 } 39 }
测试结果自己查看。
2.4.2、基于BC实现URLBase64
1 package com.util.base64; 2 3 import java.io.UnsupportedEncodingException; 4 import org.bouncycastle.util.encoders.UrlBase64; 5 /** 6 * 基于BC的URLBase64加密 7 */ 8 public class URLBase64CoderBC { 9 private static final String ENCODING = "UTF-8"; 10 /** 11 * URLBase64加密 12 */ 13 public static String encode(String data) throws UnsupportedEncodingException{ 14 byte[] encodedByte = UrlBase64.encode(data.getBytes(ENCODING)); 15 return new String(encodedByte, ENCODING); 16 } 17 /** 18 * URLBase64解密 19 */ 20 public static String decode(String data) throws UnsupportedEncodingException{ 21 byte[] decodedByte = UrlBase64.decode(data.getBytes(ENCODING)); 22 return new String(decodedByte, ENCODING); 23 } 24 25 /** 26 * 测试 27 * @param args 28 * @throws UnsupportedEncodingException 29 */ 30 public static void main(String[] args) throws UnsupportedEncodingException { 31 String data = "找一个好姑娘做老婆是我的梦 想!"; 32 System.out.println("原文-->"+data); 33 String encodedStr = URLBase64CoderBC.encode(data); 34 System.out.println("加密后-->"+encodedStr); 35 String decodedStr = URLBase64CoderBC.decode(encodedStr); 36 System.out.println("解密后-->"+decodedStr); 37 System.out.println(data.equals(decodedStr)); 38 } 39 }
测试结果自己查看加密后的字符串与CC加密后字符串有什么不同。