前面學習總結了平時開發中碰見的各類數據加密方式,最終都會對加密後的二進制數據進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴格意義上來講的話不是一種加密算法,而是一種編碼算法,爲什麼要使用Base64編碼呢?它解決了什麼問題?這也是本文探討的東西?html
其餘幾種加密方式:算法
Base64是網絡上最多見的用於傳輸8Bit字節代碼的編碼方式之一,Base64並非安全領域的加密算法,其實Base64只能算是一個編碼算法,對數據內容進行編碼來適合傳輸。標準Base64編碼解碼無需額外信息即徹底可逆,即便你本身自定義字符集設計一種類Base64的編碼方式用於數據加密,在多數場景下也較容易破解。Base64編碼本質上是一種將二進制數據轉成文本數據的方案。對於非二進制數據,是先將其轉換成二進制形式,而後每連續6比特(2的6次方=64)計算其十進制值,根據該值在A--Z,a--z,0--9,+,/ 這64個字符中找到對應的字符,最終獲得一個文本字符串。基本規則以下幾點:spa
下圖爲Base64編碼表debug
在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,好比說從A地傳到B地,每每要通過多個路由設備,因爲不一樣的設備對字符的處理方式有一些不一樣,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。因此就先把數據先作一個Base64編碼,通通變成可見字符,這樣出錯的可能性就大下降了。
String encodedString = Base64.encodeToString("whoislcj".getBytes(), Base64.DEFAULT);
Log.e("Base64", "Base64---->" + encodedString);
String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT)); Log.e("Base64", "Base64---->" + decodedString);
File file = new File("/storage/emulated/0/pimsecure_debug.txt"); FileInputStream inputFile = null; try { inputFile = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; inputFile.read(buffer); inputFile.close(); encodedString = Base64.encodeToString(buffer, Base64.DEFAULT); Log.e("Base64", "Base64---->" + encodedString); } catch (Exception e) { e.printStackTrace(); }
File desFile = new File("/storage/emulated/0/pimsecure_debug_1.txt"); FileOutputStream fos = null; try { byte[] decodeBytes = Base64.decode(encodedString.getBytes(), Base64.DEFAULT); fos = new FileOutputStream(desFile); fos.write(decodeBytes); fos.close(); } catch (Exception e) { e.printStackTrace(); }
不管是編碼仍是解碼都會有一個參數Flags,Android提供瞭如下幾種
DEFAULT 這個參數是默認,使用默認的方法來加密
NO_PADDING 這個參數是略去加密字符串最後的」=」
NO_WRAP 這個參數意思是略去全部的換行符(設置後CRLF就沒用了)
CRLF 這個參數看起來比較眼熟,它就是Win風格的換行符,意思就是使用CR LF這一對做爲一行的結尾而不是Unix風格的LF
URL_SAFE 這個參數意思是加密時不使用對URL和文件名有特殊意義的字符來做爲加密字符,具體就是以-和_取代+和/
Base64編碼看似簡單,可是其在實際開發中使用至關普遍。目前項目中只是用到這麼多,之後用到更復雜的狀況的時候再作補充。