1.Java 加解密技術系列之 BASE64

Java 加解密技術系列之 BASE64html

 

  • 序號
  • 背景
  • 正文
  • 總結

 


這段時間,工做中 用到了 Java 的加解密技術,本着學習的態度,打算從這篇文章開始,詳細的研究一番 Java 在加解密技術上有什麼不同凡響,同時,也想爲你們或者本身留下點什麼,一塊分享這其中的「精髓」。須要說明的是,這個系列可能要持續一段時間,由於,加解 密的相關技術太多太多了,要搞明白這些着實不是一件容易的事。


背景

說到這個加解密技 術,以前一直沒有機會研究這個東西,此次公司裏的項目須要加解密的支持,所以有機會可以好好研究這一塊。剛開始寫的時候,還在考慮是寫一篇文章仍是寫一個 系列,後來我發現,加解密這塊的東西不少,若是一篇文章的話,就我如今這種水平,還遠遠不能一篇以序之,因此,仍是決定採用細嚼慢嚥的方式,來一點一點的 消化。


正文

廢話說了不少,終於要進正題了。

其實,嚴格來講,BASE64 是一種編碼的方式,並非真正意義上的加解密,不過,從另外一個角度來考慮的話,就是把數據變爲人不會用肉眼能分辨其真實性的角度來講,BASE64 也是屬於加解密範疇的。並且,有的加密技術,也是須要經過 BASE64 來編碼轉換的。

那麼,BASE64 究竟是什麼呢?下面我來大概的介紹一下 BASE64 的編碼原理。

BASE64 的編碼都是按字符串長度,以每 3 個 8 bit 的字符爲一組,而後針對每組,首先獲取每一個字符的 ASCII 編碼,而後將 ASCII 編碼轉換成 8 bit 的二進制,獲得一組 3*8=24 bit 的字節。而後再將這 24 bit 劃分爲 4 個 6 bit 的字節,並在每一個 6 bit 的字節前面都填兩個高位 0,獲得 4 個 8 bit 的字節,而後將這 4 個 8 bit 的字節轉換成十進制,對照 BASE64 編碼表 (下表),獲得對應編碼後的字符。

注:1. 要求被編碼字符是8bit的,因此須在ASCII編碼範圍內,\u0000-\u00ff,中文就不行。
  2. 若是被編碼字符長度不是3的倍數的時候,則都用0代替,對應的輸出字符爲=



原理講清楚了,下面舉兩個例子說明一下。

a) 字符長度爲能被3整除時:好比「Tom」 :



因此,btoa('Tom') = VG9t,也就是說,「Tom」的 BASE64 編碼結果爲 VG9t。

b) 字符串長度不能被3整除時,好比「Lucy」:



因爲 Lucy 只有 4 個字母,因此按 3 個一組的話,第二組還有兩個空位,因此須要用 0 來補齊。這裏就須要注意,由於是須要補齊而出現的 0,因此轉化成十進制的時候就不能按常規用 BASE64 編碼表來對應,因此不是 a, 能夠理解成爲一種特殊的「異常」,編碼應該對應「=」。


結束語

經過我上邊說的這 些,我想你已經瞭解了 BASE64 編碼的原理,固然,若是你如今去看 Java 中有關 BASE64 編碼源碼的話,我想你必定能很快就搞明白的。不過,在此以前,推薦你仍是要親自試一下,用程序編碼一個單詞,而後使用上邊提到的原理,人工編碼相同的單 詞,你就會更加清楚是怎麼回事。

順帶說一句,工做中,不能由於有了計算機,就什麼事都要依賴它。有一句話,我想你們都知道,「用進廢退」,就是這個道理。核心的東西掌握了,再來藉助計算機,那就是事半功倍了,不然只會淪爲高科技時代的奴隸。

 


 

1.Base64將輸入的字符串或一段數據編碼成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}這64個字符的串,'='用於填充。java

 

2.做用web

 

  • 首先這算法是編碼, 不是壓縮, 編碼後只會增長字節數;
  • 算法簡單, 幾乎不會影響效率;
  • 算法可逆, 解碼很方便, 不用於私密信息通訊;
  • 雖然解碼方便, 但畢竟編碼了, 肉眼仍是不能直接看出原始內容;
  • 加密後的字符串只有[0-9a-zA-Z+/=], 不可打印字符(包括轉移字符)也可傳輸;

 

3.Base64主要用於將不可打印的字符轉換成可打印字符,或者簡單的說將二進制數據編碼成ASCII字符。正則表達式

將二進制數據編碼成ASCII字符主要的目的是能在純文本內容中插入二進制數據,常見的應用場景包括:算法

  1. 電子郵件數據庫

    這個可參考阮一峯的《MIME筆記》apache

  2. 微軟的MHT格式編程

    這是模仿郵件格式將多種資源打包在一個文件中的格式,全部二進制資源都採用 Base64 編碼。網絡

  3. XML文件app

    這是一個純文本文件,若是要基於 XML 格式設計能夠保存圖片或其它附件的數據格式,那就須要將這些二進制數據轉碼成 ASCII 字符。

  4. DATA URL

    最近流行起來的 Data URL,要在URL中使用二進制數據,固然也只能進行 ASCII 編碼

 


 

編解碼:Base64編碼在URL中的應用

項目查詢背景:目前項目中,本地文件所有使用UTF-8進行編碼,Android網絡訪問所有采用Base64加密傳輸,所以考慮Base64和Url編碼是否會有衝突,查詢的結果是沒有衝突,能夠直接放在Url中穩定傳輸。

如下是查詢的結果,方便之後查詢。

Base64編碼詳解:http://www.cnblogs.com/lifesting/archive/2012/07/12/2587923.html

如下內容引用地址:http://hi.baidu.com/westfruit/item/bc09df16c7ae5d761009b5d6

Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的惟一標識符(通常爲128-bit的UUID)編碼爲一個字符串, 用做HTTP表單和HTTP GET URL中的參數。在其餘應用程序中,也經常須要把二進制數據編碼爲適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼不只比較簡短, 同時也具備不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
  然而,標準的Base64並不適合直接放在URL裏傳輸,由於URL編碼器會把標準Base64中的「/」和「+」字符變爲形如「%XX」的形式,而這些「%」號在存入數據庫時還須要再進行轉換,由於ANSI SQL中已將「%」號用做通配符。
   爲解決此問題,可採用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標準Base64中的「+」和「/」分別改爲了「*」和 「-」,這樣就免去了在URL編解碼和數據庫存儲時所要做的轉換,避免了編碼信息長度在此過程當中的增長,並統一了數據庫、表單等處對象標識符的格式。
  另有一種用於正則表達式的改進Base64變種,它將「+」和「/」改爲了「!」和「-」,由於「+」,「*」以及前面在IRCu中用到的「[」和「]」在正則表達式中均可能具備特殊含義。
  此外還有一些變種,它們將「+/」改成「_-」或「._」(用做編程語言中的標識符名稱)或「.-」(用於XML中的Nmtoken)甚至「_:」(用於XML中的Name)。 []在迅雷下載地址中的應用  不少下載類網站都提供「迅雷下載」的連接,其地址一般是加密的迅雷專用下載地址。
  如thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
  其實迅雷的「專用地址」也是用Base64加密的,其加密過程以下:
  1、在地址的先後分別添加AA和ZZ
  如www.baidu.com/img/sslm1_logo.gif變成
  AAwww.baidu.com/img/sslm1_logo.gifZZ
  2、對新的字符串進行Base64編碼
  如AAwww.baidu.com/img/sslm1_logo.gifZZ用Base64編碼獲得
  QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
  3、在上面獲得的字符串前加上「thunder://」就成了
  thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==

 


 

 

有時候咱們須要使用一個URL做爲URL地址的參數來傳遞,假如咱們須要傳遞的URL含有參數,例如:

/shopping/confirm.action?id=1&name=itzhai

那麼按照以下的方法傳送,那麼,參數會丟失:

www.itzhai.com/submit.action?url=/shopping/confirm.action?id=1&name=itzhai;

爲了能正常的傳遞參數,咱們可使用Base64對URL進行編碼後再傳遞,接收到時再進行解碼,這樣就能夠正確獲取到傳遞的URL了。下面是基本的代碼:

引入Jar包

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

爲URL編碼:

String url = "/shopping/confirm.action?id=1&name=itzhai";
String code = new String(Base64.encode(url.getBytes()));

這樣得到的code爲:

L3Nob3BwaW5nL2NvbmZpcm0uYWN0aW9uP2lkPTEmbmFtZT1pdHpoYWk=

而後接受到該code時,就能夠爲URL解碼了:

String url = new String(Base64.decode("L3Nob3BwaW5nL2NvbmZpcm0uYWN0aW9uP2lkPTEmbmFtZT1pdHpoYWk="));

 

 

 

 

 

 

 

 

 

轉自-http://blog.csdn.net/happylee6688/article/details/43950521

相關文章
相關標籤/搜索