注意:本篇文章是本人閱讀相關(guān)文章所寫下的總結(jié),方便以后查閱,所有內(nèi)容非原創(chuàng),侵權(quán)刪。
本篇文章內(nèi)容來自于:
1.Android數(shù)據(jù)加密之Base64編碼算法
目錄
- 什么是Base64編碼算法
- Base64編碼的用處是什么,解決了什么問題?
- Base64編碼實例
--3.0 Base64編碼使用函數(shù)介紹
--3.1 對字符串進行Base64編碼
--3.2 對文件進行Base64編碼
--3.3 對圖片進行Base64編碼(待補)
各種數(shù)據(jù)加密方式,最終都會對加密后的二進制數(shù)據(jù)進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴(yán)格意義上來說的話不是一種加密算法,而是一種編碼算法,為何要使用Base64編碼呢?它解決了什么問題?
1. 什么是Base64編碼算法
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一。Base64并不是安全領(lǐng)域的加密算法,其實Base64只能算是一個編碼算法,對數(shù)據(jù)內(nèi)容進行編碼來適合傳輸。標(biāo)準(zhǔn)Base64編碼解碼無需額外信息即完全可逆.
Base64編碼本質(zhì)是一種將二進制數(shù)據(jù)轉(zhuǎn)成文本數(shù)據(jù)的方案。
對于非二進制數(shù)據(jù),是先將其轉(zhuǎn)換成二進制形式,然后每連續(xù)6比特(2的6次方=64)計算其十進制值,根據(jù)該值在A-Z,a-z,0-9,+,/這個64個字符中找到對應(yīng)的字符,最終得到一個文本字符串。
基本規(guī)則:
1.標(biāo)準(zhǔn)Base64只有64個字符(A-Z,a-z,0-9,+,/)以及用作后綴等號。
2.Base64是把3個字節(jié)變成4個可打印字符,所以Base64編碼后的字符串一定能被4整除(不算用作后綴的等號)。
3.等號一定用作后綴,且數(shù)目一定是0個、1個或者2個。這是因為如果原文長度不能被3整除,Base64要在后面添加\0湊齊3N位。為了正確還原,添加了幾個\0就加上幾個等號,所以添加等號的數(shù)目只能是0、1、2。
Base64編碼算法主要不是加密,而是把一些二進制數(shù)轉(zhuǎn)成普通字符用于網(wǎng)絡(luò)傳輸。
2. Base64編碼的用處是什么,解決了什么問題?
在計算機中任何數(shù)據(jù)都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時,比如說從A地傳到B地,往往要經(jīng)過多個路由設(shè)備,由于不同的設(shè)備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸?shù)?。所以?strong>先把數(shù)據(jù)先做一個Base64編碼,統(tǒng)統(tǒng)變成可見字符,這樣出錯的可能性就大降低了。
3. Base64編碼實例
3.0 Base64編碼使用函數(shù)介紹
編碼函數(shù)
public static String encodeToString(byte[] input, int flags)
public static String encodeToString(byte[] input, int offset, int len, int flags) {
public static byte[] encode(byte[] input, int flags)
public static byte[] encode(byte[] input, int offset, int len, int flags)
解碼函數(shù)
public static byte[] decode(String str, int flags)
public static byte[] decode(byte[] input, int flags)
public static byte[] decode(byte[] input, int offset, int len, int flags)
關(guān)于int flags,默認(rèn)使用Base64.DEFAULT
無論是編碼還是解碼都會有一個參數(shù)Flags,Android提供了以下幾種
DEFAULT 這個參數(shù)是默認(rèn),使用默認(rèn)的方法來加密
NO_PADDING 這個參數(shù)是略去加密字符串最后的”=”
NO_WRAP 這個參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒用了)
CRLF 這個參數(shù)看起來比較眼熟,它就是Win風(fēng)格的換行符,意思就是使用CR LF這一對作為一行的結(jié)尾而不是Unix風(fēng)格的LF
URL_SAFE 這個參數(shù)意思是加密時不使用對URL和文件名有特殊意義的字符來作為加密字符,具體就是以-和_取代+和/
3.1 對字符串進行Base64編碼
- 字符串進行Base64編碼
String encodeStr = Base64.encodeToString("haha".getBytes(), Base64.DEFAULT);
Log.d("xl",encodeStr);
//結(jié)果 xl: aGFoYQ==
- 字符串進行Base64解碼
byte[] decode = Base64.decode(encodeStr, Base64.DEFAULT);
String decodeStr = new String(decode);
Log.d("xl",decodeStr);
//結(jié)果 haha
3.2 對文件進行Base64編碼
- 文件進行Base64編碼
String content = "你好嗎呀呀呀呀呀abcded123";
//文件base64編碼
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "base64.txt");
FileOutputStream fos = new FileOutputStream(file);
String decodeStr = Base64.encodeToString(content.getBytes(), Base64.DEFAULT);
fos.write(decodeStr.getBytes());
fos.close();
- 文件進行Base64解碼
//文件base64解碼
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "base64.txt");
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String rel = baos.toString();
String decodeRel = new String(Base64.decode(rel, Base64.DEFAULT));
Log.d("xl", rel);
Log.d("xl", decodeRel);
fis.close();
3.3 對圖片進行Base64編碼
實例:向服務(wù)器上傳一張圖片,要求把圖片轉(zhuǎn)化成圖片流放在json字符串里傳輸。類似{“name”:”lking”,”age”:”20”,”headpic”:”圖片流(Base64編碼的圖片流字符)”}