• 第二章 Base64与URLBase64


    2.1、算法基本规则:

    • 加密的算法公开
    • 加密的密钥不公开

    Base64算法公开、密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作。

    注意:具体的算法与密钥(对于Base64来讲,是一张字符映射表)可在《Java加密与解密的艺术(第2版)》第5章“电子邮件传输算法--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个字符,都要在行尾添加“
    ”
    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 }
    View Code

    第三步:测试

    上述代码的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 }
    View Code

    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 }
    View Code

     测试结果自己查看。

    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 }
    View Code

     测试结果自己查看加密后的字符串与CC加密后字符串有什么不同。

  • 相关阅读:
    MATLAB调用VISUAL STUDIO 编写的C++函数
    卡尔曼滤波
    资料(不定时更新)
    20201207-总结
    20201126-1 每周例行报告
    20201120-1 每周例行报告
    作业要求 20201112-1 每周例行报告
    20201105-1 每周例行报告
    作业要求 20201029-1 每周例行报告
    作业要求 20201022-1 每周例行报告
  • 原文地址:https://www.cnblogs.com/java-zhao/p/5083427.html
Copyright © 2020-2023  润新知