第二章 Base64与URLBase64
2.1、算法基本规则:
- 加密的算法公开
- 加密的密钥不公开
Base64算法公开、密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作。
2.2、应用场景
- 简单加密(加密要求不高的情况下,即一眼看不穿的那种情况下使用)
- 加密(改造字符映射表,即私藏秘钥)
- 电子邮件传输(邮件内容使用Base64加密,实际上主要是处理中文问题的)
- 网络数据传输(与URLBase64相关,下边会讲)
- 密钥存储(密钥是一段二进制数据,密钥在通信双方的传递过程:甲方将密钥采用Base64编码,写入文档,通过安全途径(例如线下等)传给乙方,采用Base64存储密钥是为了增强密钥的易读性)
- 数字证书存储
- OpenSSL操作Base64产生数字证书
通常,我们使用Base64最多的情况就是存储密钥。
2.3、Base64实现方式
实现方式有三种:
- Commons Codec(简称“CC”)
- Bouncy Castle(简称“BC”)
- JDK(不推荐使用,当做JDK没实现即可)
其中,最推荐使用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方式传递二进制数据。
- commons codec(CC,推荐使用,因为不采用尾部补全,所以数据长度较短,减少了网络传输时间,尾部补全是Base64的)
- bouncy castle(BC)
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加密后字符串有什么不同。

浙公网安备 33010602011771号