参考:OSC闲人 – https://my.oschina.net/benhaile/blog/267738
引言
前面介绍Java8的新特性Base64,后面直接上标题的整合代码。
介绍BASE64
BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加解密算法。能起来安全作用的效果很差,而且很容易破解,它的核心作用应该是传输数据的正确性,有些网关或系统只能使用欧冠ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。
JDK里面实现Base64的API
在JDK1.6之前,JDK核心类一直没有Base64的实现类,有人建议使用Sun/Oracle JDK里面的sun.misc.BASE64Encoder 和 sun.misc.BASE64Decoder,使用它们的优点就是不需要依赖第三方库,缺点就是可能在未来版本会被删除(用maven编译会发出警告),而且性能不佳。
JDK1.6中添加了另一个BASE64的实现,javax.xml.bind.DatatypeConverter 两个静态方法parseBase64Binary 和 printBase64Binary,隐藏在javax.xml.bind 包下面,不被很多开发者知道。
在Java8 java.uitl 包下面实现了BASE64编解码API,而且性能不俗,API也简单易懂,下面展示下这个类的使用例子。
java.uitl.Base64
该类提供了一套静态方法获取下面三种BASE64编解码器:
- Basic编码:是标准的BASE64编码,用于处理常规的需求
//编码
String asb64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
//输出c29tZSBzdHJpbmc=
System.out.println(asB64);
//解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new String(asBytes,"utf-8"));
/*
输出为:some string
*/
- URL编码:使用下划线替换URL里面的反斜线“/”
String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet:"+urlEncoded);
//输出为:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==
- MIME编码:使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。
StringBuilder sb = new StringBuilder();
for(int t = 0; t < 10; ++t){
sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);
Java8性特性Base64+加解密Demo
public static byte[] decode(String _key, byte[] data) {
try {
byte[] key = _key.getBytes("utf-8");
DESedeKeySpec spec = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("desede");
Key desKey = keyFactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/ECB/PKCS5Padding");
cipher.init(2, desKey);
return cipher.doFinal(data);
} catch (Exception var7) {
var7.printStackTrace();
return null;
}
}
public static void main(String[] args) throws UnsupportedEncodingException {
String key = MD5.MD5("123456xksquare");
String str = "{111,222}";
System.out.println(key);
String str1 = Base64.getEncoder().encodeToString(encode(key, str));
System.out.println("加密结果" + str1);
String out = new String(decode(key, Base64.getDecoder().decode(str1.getBytes("utf-8"))), "utf-8");
System.out.println("解密参数:" + out);
}
//工具类
public class Des3Utils {
protected final static Log logger = LogFactory.getLog(Des3Utils.class);
public static final String key = "1234567890qwertyuiopasdf";
public static Key convertSecretKey =null;
static {
try {
byte[] bytesKey = build3DesKey(key);
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
keyGenerator.init(112);
// KEY转换
DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
convertSecretKey = factory.generateSecret(desKeySpec);
}catch (Exception e){
logger.error(e);
}
}
/**
* 加密
* @param content
* @return
*/
public static String encrypt(String content){
try {
// 加密
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result = cipher.doFinal(content.getBytes());
return encode(result);
}catch (Exception e){
logger.error(e);
}
return null;
}
/**
* 解密
* @param content
* @return
*/
public static String decrypt(String content){
byte[] result = null;
try {
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
// 解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result = cipher.doFinal(decode(content));
return new String(result);
}catch (Exception e){
logger.error(e);
}
return null;
}
/**
* base64编码
* @param bstr
* @return
*/
public static String encode(byte[] bstr){
return new sun.misc.BASE64Encoder().encode(bstr);
}
/**
* base64解码
* @param str
* @return string
*/
public static byte[] decode(String str){
byte[] bt = null;
try {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
bt = decoder.decodeBuffer( str );
} catch (IOException e) {
e.printStackTrace();
}
return bt;
}
public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
byte[] key = new byte[24]; //声明一个24位的字节数组,默认里面都是0
byte[] temp = keyStr.getBytes("UTF-8"); //将字符串转成字节数组
/*
* 执行数组拷贝
* System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位)
*/
if(key.length > temp.length){
//如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中
System.arraycopy(temp, 0, key, 0, temp.length);
}else{
//如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中
System.arraycopy(temp, 0, key, 0, key.length);
}
return key;
}
public static void main(String[] args) throws Exception{
//String b = decrypt(URLDecoder.decode("%2BtZILuHyeRoLXkX7qnW1rrCRWfm7IOjV", "utf-8"));
String e = URLEncoder.encode("dIGjPfvHm6E=", "utf-8");
System.out.println(e);
}
}