第二章 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加密后字符串有什么不同。

posted @ 2022-05-22 15:02  hanease  阅读(716)  评论(0编辑  收藏  举报