Android數(shù)據(jù)加密之Base64編碼算法的簡單實現(xiàn)
前面學(xué)習(xí)總結(jié)了平時開發(fā)中遇見的各種數(shù)據(jù)加密方式,最終都會對加密后的二進制數(shù)據(jù)進行Base64編碼,起到一種二次加密的效果,其實呢Base64從嚴格意義上來說的話不是一種加密算法,而是一種編碼算法,為何要使用Base64編碼呢?它解決了什么問題?這也是本文探討的東西?
什么Base64算法?
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一,Base64并不是安全領(lǐng)域的加密算法,其實Base64只能算是一個編碼算法,對數(shù)據(jù)內(nèi)容進行編碼來適合傳輸。標準Base64編碼解碼無需額外信息即完全可逆,即使你自己自定義字符集設(shè)計一種類Base64的編碼方式用于數(shù)據(jù)加密,在多數(shù)場景下也較容易破解。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ī)則如下幾點:
標準Base64只有64個字符(英文大小寫、數(shù)字和+、/)以及用作后綴等號;Base64是把3個字節(jié)變成4個可打印字符,所以Base64編碼后的字符串一定能被4整除(不算用作后綴的等號);等號一定用作后綴,且數(shù)目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,Base64要在后面添加\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然添加等號的數(shù)目只能是0、1或2;嚴格來說Base64不能算是一種加密,只能說是編碼轉(zhuǎn)換。
下圖為Base64編碼表
Base64編碼的用處?
在計算機中任何數(shù)據(jù)都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時,比如說從A地傳到B地,往往要經(jīng)過多個路由設(shè)備,由于不同的設(shè)備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利于傳輸?shù)?。所以就先把?shù)據(jù)先做一個Base64編碼,統(tǒng)統(tǒng)變成可見字符,這樣出錯的可能性就大降低了。
Base64具體實現(xiàn)
1.)字符串進行Base64編碼
String encodedString = Base64.encodeToString("whoislcj".getBytes(), Base64.DEFAULT); Log.e("Base64", "Base64---->" + encodedString);
2.)字符串進行Base64解碼
String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT)); Log.e("Base64", "Base64---->" + decodedString);
3.)對文件進行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.)對文件進行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ù)說明
無論是編碼還是解碼都會有一個參數(shù)Flags,Android提供了以下幾種
DEFAULT 這個參數(shù)是默認,使用默認的方法來加密
NO_PADDING 這個參數(shù)是略去加密字符串最后的”=”
NO_WRAP 這個參數(shù)意思是略去所有的換行符(設(shè)置后CRLF就沒用了)
CRLF 這個參數(shù)看起來比較眼熟,它就是Win風格的換行符,意思就是使用CR LF這一對作為一行的結(jié)尾而不是Unix風格的LF
URL_SAFE 這個參數(shù)意思是加密時不使用對URL和文件名有特殊意義的字符來作為加密字符,具體就是以-和_取代+和/
總結(jié):
Base64編碼看似簡單,但是其在實際開發(fā)中使用相當廣泛。目前項目中只是用到這么多,以后用到更復(fù)雜的情況的時候再做補充。
以上就是小編為大家?guī)淼腁ndroid數(shù)據(jù)加密之Base64編碼算法的簡單實現(xiàn)全部內(nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
Android實現(xiàn)音頻條形圖效果(仿音頻動畫無監(jiān)聽音頻輸入)
這篇文章主要介紹了Android實現(xiàn)音頻條形圖效果(仿音頻動畫無監(jiān)聽音頻輸入)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Android實現(xiàn)滑動刪除操作(PopupWindow)
這篇文章主要介紹了Android ListView結(jié)合PopupWindow實現(xiàn)滑動刪除的相關(guān)資料,需要的朋友可以參考下2016-07-07詳解Android App中創(chuàng)建ViewPager組件的方法
這篇文章主要介紹了詳解Android App中創(chuàng)建ViewPager組件的方法,ViewPager最基本的功能就是可以使視圖滑動,需要的朋友可以參考下2016-03-03ViewPager+PagerAdapter實現(xiàn)帶指示器的引導(dǎo)頁
這篇文章主要為大家詳細介紹了ViewPager+PagerAdapter實現(xiàn)帶指示器的引導(dǎo)頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-09-09利用SurfaceView實現(xiàn)下雨與下雪動畫效果詳解(Kotlin語法)
這篇文章主要給大家介紹了關(guān)于利用SurfaceView實現(xiàn)下雨與下雪動畫效果的相關(guān)資料,需要一些基本的View知識和會一些基礎(chǔ)Kotlin語法,文中給出了詳細的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09