最近開發中,遇到業務場景,需要通過接口獲取XML報文中一個長度爲3000字符串類型的IO圖片流,瞭解後知道是通過BASE64加密的,學習了下BASE64加密。
一、BASE64簡介
Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java
Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一標識符(一般爲128-bit的UUID)編碼爲一個字符串,用作HTTP表單和HTTP
GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼爲適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
二、BASE64的原理
1.假設有3個字符,首先先將他換成10進制ASCII碼,然後轉成2進制,少位用0補齊,保證8位。
2.因爲ASCII碼大小是一字節也就是8位,3個8位。又因爲3*8=4*6,我們給他分成4分,每份6位。如果少位都用0補齊。
3.把6位碼前2位加兩個0,比如010000轉完後就是00010000,這對計算機來說比較重要,變成了8位碼。
4.將4個8位(也就是一字節)碼按照RFC裏的BASE64標準換算,下面也提供了標準表。
這樣我們就得到了QVNU,也就是AST加密的結果。
下面是標準的BASE64編碼表。
三、BASE64的應用場景
其實BASE64不是用來加密的。經過BASE64編碼後的字符串,全部都是由標準鍵盤上面的常規字符組成,這樣編碼後的字符串在網關之間傳遞不會產生UNICODE字符串不能識別或者丟失的現象。其實EMAIL就是用base64編碼過後再發送的。然後接收的時候再還原。還有一種情況下用BASE64編碼也很好,比如一個圖片文件,或者其他任何二進制文件。我可以把它編碼成字符串。這樣用XML或者數據庫就能直接以文本的方式來存儲這些文件了。
四、BASE64的加密和解密
前端使用js: pwd = new Base64.encode(pwd); 後端使用java, new Base64().decodeBase64(pwd.getBytes()).toString(); java的Base64()有提供decode和decodeBase64()這倆種方法,我習慣的以爲是decode(),結果卻是後者. 下面是我編寫的一個小的測試例子,利用sun jdk自帶的sun.misc.BASE64Decoder進行加密和解密 也可以通過很多第三方的開源JAR包進行加密解密,如:apache的commons-codec
import java.io.UnsupportedEncodingException;
import sun.misc.*;
/**
* Created by Tanyunlong on 2016/10/18.
*/
public class Base64Test {
public static void main(String args[]){
String code="JDLKAHJKDAHJKDHASJKDHASJKHDKJASD";
String Base64Code="";
Base64Code=getbase64(code);
System.out.println(Base64Code);
String base64Code="SkRMS0FISktEQUhKS0RIQVNKS0RIQVNKS0hES0pBU0Q=";
String result=getfromBase64(base64Code);
System.out.println(result);
}
/**
* Base 加密
* @param code
* @return result
*/
public static String getbase64(String code){
byte[] b =null;
String result=null;
try {
b=code.getBytes("utf-8");
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
System.out.println("==============="+b);
if (b!=null){
result=new BASE64Encoder().encode(b);
}
return result;
}
/**
* 解密
*
*/
public static String getfromBase64(String baseCode){
byte[] b=null;
String result=null;
if (baseCode!=null){
BASE64Decoder decoder=new BASE64Decoder();
try {
b=decoder.decodeBuffer(baseCode);
result = new String(b, "utf-8");
}catch (Exception e){
e.printStackTrace();
}
}
return result;
}
}