【Java----加密解密】第⼆章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
第⼆步:编写代码
package com.util.base64;
import java.io.UnsupportedEncodingException;
import dec.binary.Base64;
/**
* 基于Commons Codec的Base64加密
*/
*/
public class Base64CoderCC {
private static final String ENCODING = "UTF-8";
/**
* ⼀般Base64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Bytes(ENCODING));
return new String(encodedByte, ENCODING);
}
/**
* 安全Base64加密
*/
public static String encodeSafe(String data) throws UnsupportedEncodingException{
/*
* 注意:这⾥采⽤的encodeBase64(byte[] bytes, boolean arg1)
* arg1为true时,加密后的字符串每⾏为76个字符,不论每⾏够不够76个字符,都要在⾏尾添加“\r\n”        */
byte[] encodedByte = Bytes(ENCODING),true);
return new String(encodedByte, ENCODING);
}
/**
* Base64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.Bytes(ENCODING));
return new String(decodedByte, ENCODING);
}
/**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
/
********************测试⼀般encode*********************/
String data = "⼀个好姑娘做⽼婆是我的梦想!";
System.out.println("原⽂-->"+data);
String encodedStr = de(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = Base64CoderCC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
System.out.println("================================");
/********************测试安全encode*********************/
String data2 = "⼀个好姑娘做⽼婆是我的梦想!⼀个好姑娘做⽼婆是我的梦想!";
System.out.println("原⽂-->"+data2);
String encodedStr2 = deSafe(data2);
System.out.println("加密后-->"+encodedStr2);
String decodedStr2 = Base64CoderCC.decode(encodedStr2);
System.out.println("解密后-->"+decodedStr2);
System.out.println(data2.equals(decodedStr2));
}
}
第三步:测试
上述代码的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.ders.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 = Bytes(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.Bytes(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 = de(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
package com.util.base64;
import java.io.UnsupportedEncodingException;
import dec.binary.Base64;
/**
* 基于Commons Codec的URLBase64加密
*/
public class URLBase64CoderCC {
private static final String ENCODING = "UTF-8";
/**
* URLBase64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{
byte[] encodedByte = Bytes(ENCODING));
return new String(encodedByte, ENCODING);
}
/**
* URLBase64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{
byte[] decodedByte = Base64.Bytes(ENCODING));
return new String(decodedByte, ENCODING);
}
/**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
String data = "⼀个好姑娘做⽼婆是我的梦想!";
System.out.println("原⽂-->"+data);
String encodedStr = de(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = URLBase64CoderCC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
}
}
测试结果⾃⼰查看。
2.4.2、基于BC实现URLBase64
package com.util.base64;
import java.io.UnsupportedEncodingException;
import org.ders.UrlBase64;
/**
* 基于BC的URLBase64加密
*/
public class URLBase64CoderBC {
private static final String ENCODING = "UTF-8";
/**
* URLBase64加密
*/
public static String encode(String data) throws UnsupportedEncodingException{        byte[] encodedByte = Bytes(ENCODING));
return new String(encodedByte, ENCODING);
}
/**
* URLBase64解密
*/
public static String decode(String data) throws UnsupportedEncodingException{        byte[] decodedByte = UrlBase64.Bytes(ENCODING));
return new String(decodedByte, ENCODING);
}
/**
* 测试
* @param args
* @throws UnsupportedEncodingException
*/
java加密方式有哪些public static void main(String[] args) throws UnsupportedEncodingException {        String data = "⼀个好姑娘做⽼婆是我的梦想!";
System.out.println("原⽂-->"+data);
String encodedStr = de(data);
System.out.println("加密后-->"+encodedStr);
String decodedStr = URLBase64CoderBC.decode(encodedStr);
System.out.println("解密后-->"+decodedStr);
System.out.println(data.equals(decodedStr));
}
}
测试结果⾃⼰查看加密后的字符串与CC加密后字符串有什么不同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。