前言:
前面學(xué)習(xí)總結(jié)了平時(shí)開發(fā)中遇見的各種數(shù)據(jù)加密方式几颜,最終都會對加密后的二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼幼苛,起到一種二次加密的效果卵史,其實(shí)呢Base64從嚴(yán)格意義上來說的話不是一種加密算法舰讹,而是一種編碼算法娃承,為何要使用Base64編碼呢?它解決了什么問題拟赊?這也是本文探討的東西刺桃?
其他幾種加密方式:
Android數(shù)據(jù)加密之Rsa加密
Android數(shù)據(jù)加密之Aes加密
Android數(shù)據(jù)加密之Des加密
Android數(shù)據(jù)加密之MD5加密
Android數(shù)據(jù)加密之Base64編碼算法
Android數(shù)據(jù)加密之異或加密算法
什么Base64算法粹淋?
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一吸祟,Base64并不是安全領(lǐng)域的加密算法瑟慈,其實(shí)Base64只能算是一個(gè)編碼算法,對數(shù)據(jù)內(nèi)容進(jìn)行編碼來適合傳輸屋匕。標(biāo)準(zhǔn)Base64編碼解碼無需額外信息即完全可逆葛碧,即使你自己自定義字符集設(shè)計(jì)一種類Base64的編碼方式用于數(shù)據(jù)加密,在多數(shù)場景下也較容易破解过吻。Base64編碼本質(zhì)上是一種將二進(jìn)制數(shù)據(jù)轉(zhuǎn)成文本數(shù)據(jù)的方案进泼。對于非二進(jìn)制數(shù)據(jù),是先將其轉(zhuǎn)換成二進(jìn)制形式纤虽,然后每連續(xù)6比特(2的6次方=64)計(jì)算其十進(jìn)制值乳绕,根據(jù)該值在A--Z,a--z,0--9,+,/ 這64個(gè)字符中找到對應(yīng)的字符,最終得到一個(gè)文本字符串逼纸⊙蟠耄基本規(guī)則如下幾點(diǎn):
標(biāo)準(zhǔn)Base64只有64個(gè)字符(英文大小寫、數(shù)字和+杰刽、/)以及用作后綴等號菠发;
Base64是把3個(gè)字節(jié)變成4個(gè)可打印字符,所以Base64編碼后的字符串一定能被4整除(不算用作后綴的等號)贺嫂;
等號一定用作后綴滓鸠,且數(shù)目一定是0個(gè)、1個(gè)或2個(gè)第喳。這是因?yàn)槿绻拈L度不能被3整除糜俗,Base64要在后面添加\0湊齊3n位。為了正確還原曲饱,添加了幾個(gè)\0就加上幾個(gè)等號吩跋。顯然添加等號的數(shù)目只能是0、1或2渔工;
嚴(yán)格來說Base64不能算是一種加密锌钮,只能說是編碼轉(zhuǎn)換。
下圖為Base64編碼表
Base64編碼的用處引矩?
在計(jì)算機(jī)中任何數(shù)據(jù)都是按ascii碼存儲的梁丘,而ascii碼的128~255之間的值是不可見字符。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時(shí)旺韭,比如說從A地傳到B地氛谜,往往要經(jīng)過多個(gè)路由設(shè)備,由于不同的設(shè)備對字符的處理方式有一些不同区端,這樣那些不可見字符就有可能被處理錯(cuò)誤值漫,這是不利于傳輸?shù)摹K跃拖劝褦?shù)據(jù)先做一個(gè)Base64編碼织盼,統(tǒng)統(tǒng)變成可見字符杨何,這樣出錯(cuò)的可能性就大降低了酱塔。
Base64具體實(shí)現(xiàn)
1.)字符串進(jìn)行Base64編碼
String encodedString = Base64.encodeToString("whoislcj".getBytes(), Base64.DEFAULT); Log.e("Base64", "Base64---->" + encodedString);
2.)字符串進(jìn)行Base64解碼
String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT)); Log.e("Base64", "Base64---->" + decodedString);
3.)對文件進(jìn)行Base64編碼
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();}
4.)對文件進(jìn)行Base64解碼
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();}
5.)針對Base64.DEFAULT參數(shù)說明
無論是編碼還是解碼都會有一個(gè)參數(shù)Flags,Android提供了以下幾種
DEFAULT 這個(gè)參數(shù)是默認(rèn)危虱,使用默認(rèn)的方法來加密
NO_PADDING 這個(gè)參數(shù)是略去加密字符串最后的”=”
NO_WRAP 這個(gè)參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒用了)
CRLF 這個(gè)參數(shù)看起來比較眼熟羊娃,它就是Win風(fēng)格的換行符,意思就是使用CR LF這一對作為一行的結(jié)尾而不是Unix風(fēng)格的LF
URL_SAFE 這個(gè)參數(shù)意思是加密時(shí)不使用對URL和文件名有特殊意義的字符來作為加密字符埃跷,具體就是以-和_取代+和/
總結(jié):
Base64編碼看似簡單蕊玷,但是其在實(shí)際開發(fā)中使用相當(dāng)廣泛。目前項(xiàng)目中只是用到這么多弥雹,以后用到更復(fù)雜的情況的時(shí)候再做補(bǔ)充垃帅。
干我們這行,啥時(shí)候懈怠剪勿,就意味著長進(jìn)的停止挺智,長進(jìn)的停止就意味著被淘汰,只能往前沖窗宦,直到鳳凰涅槃的一天赦颇!