加密方式之BASE64

       最近開發中,遇到業務場景,需要通過接口獲取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;

    }




}












發佈了51 篇原創文章 · 獲贊 45 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章