1、base64由来
由于历史问题,电子邮件只允许ascII码字符,若是传输带有非ascII码的邮件就可能会出现乱码。因此,base64是将非ascII码的数据映射成ascII码的数据来传输的。
Base64 编码是一种将二进制数据映射到一个可印刷字符集上的技术。
2、应用
Base64位算法有编码和解码操作,可以适当的充当加密和解密操作;经常被用来做一个简单的 “加密”来保护某些数据。
3、消息传递模型
操作流程如下:
1》甲方对数据做Base64编码处理
2》甲方将编码后的数据发送给乙方
3》乙方获得数据后对数据做 Base64解码处理
4、算法实现
1> jdk自带 Bouncy Castle 实现
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.util.encoders.Base64;
public class Base64Coder {
/***
* base64 加密
* @param data 即将加密的明文
* @return
*/
public static String encode(String data){
if(StringUtils.isBlank(data)){
return null;
}
try {
byte[] b = Base64.encode(data.getBytes("utf-8"));
return new String(b);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* base64 解密
* @param data 需要解密的密文
* @return
*/
public static String decode(String data){
if(StringUtils.isBlank(data)){
return null;
}
try {
byte[] b = Base64.decode(data.getBytes("utf-8"));
return new String(b);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String data = "java base64 加解密测试";
String encodeStr = Base64Coder.encode(data);
System.out.println("明文:"+ data +"--base64 加密后:"+ encodeStr);
String decodeStr = Base64Coder.decode(encodeStr);
System.out.println("密文:"+ encodeStr +"--base64 解密后:"+ decodeStr);
// 打印结果
/**
明文:java base64 加解密测试--base64 加密后:amF2YSBiYXNlNjQg5Yqg6Kej5a+G5rWL6K+V
密文:amF2YSBiYXNlNjQg5Yqg6Kej5a+G5rWL6K+V--base64 解密后:java base64 加解密测试
*/
}
}
2>开源组件包 Commons Codec实现
jar包下载:http://commons.apache.org/proper/commons-codec/download_codec.cgi
--> commons-codec-1.10.jar
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
/**
* Commons Codec实现
* jar下载 :http://commons.apache.org/proper/commons-codec/download_codec.cgi
*/
public class Base64Coder2 {
/**
* base64 加密
* @param data 加密明文
* @return
*/
public static String encode(String data){
if(StringUtils.isBlank(data)){
return null;
}
try {
byte[] b = Base64.encodeBase64(data.getBytes("utf-8"));
return new String(b);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* base64 解密
* @param data 解密密文
* @return
*/
public static String decode(String data){
if(StringUtils.isBlank(data)){
return null;
}
try {
byte[] b = Base64.decodeBase64(data.getBytes("utf-8"));
return new String(b);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String data = "java base64 commons coder 加解密测试";
String encodeStr = Base64Coder2.encode(data);
System.out.println("明文:"+ data +"--base64 加密后:"+ encodeStr);
String decodeStr = Base64Coder2.decode(encodeStr);
System.out.println("密文:"+ encodeStr +"--base64 解密后:"+ decodeStr);
/*** 结果:
* 明文:java base64 commons coder 加解密测试--base64 加密后:amF2YSBiYXNlNjQgY29tbW9ucyBjb2RlciDliqDop6Plr4bmtYvor5U=
密文:amF2YSBiYXNlNjQgY29tbW9ucyBjb2RlciDliqDop6Plr4bmtYvor5U=--base64 解密后:java base64 commons coder 加解密测试
*/
}
}
3> jdk自带 Bouncy Castle 与 开源组件包 Commons Codec 实现的比较
Bouncy Castle 遵循了一般的 Base64算法编码,构建定长的 Base64编码使用"."符号作为填充符;Commons Codec 使用了不定长Base64编码,抛弃了填充符。从实用性而已,通过 url 参数传输数据往往要求数据长度尽可能的缩短,以缩短url长度,方便网络传输,因此:Commons Codec 是最好的选择。