密碼學(xué) | 廬山真面顽聂!你認(rèn)為 Base64 是加密算法嗎?

前言

  • 對網(wǎng)絡(luò)通信有所了解的同學(xué)盯仪,應(yīng)該都聽過 Base64 編碼紊搪。例如,我們一段數(shù)據(jù)通過 MD5 磨总、SHA 等手段加密后嗦明,經(jīng)過 Base64 編碼為字符串就可以很方便地在網(wǎng)路上傳輸。那么 Base64 也算是一種加密算法嗎蚪燕?
  • 在這篇文章里娶牌,我將帶你理解 Base64 的基本原理 & 實(shí)現(xiàn)。如果能幫上忙馆纳,請務(wù)必點(diǎn)贊加關(guān)注诗良,這真的對我非常重要。

系列文章

相關(guān)文章


目錄


1. 基本原理

Base64是一種將二進(jìn)制流表示為 64 個字符的編碼方式睛蛛。標(biāo)準(zhǔn)的 Base64 使用的索引表為:

標(biāo)準(zhǔn)的 Base64 索引表 —— 引用自維基百科

舉個例子鹦马,字符串"Base64 編碼"經(jīng)過編碼后的結(jié)果為:QmFzZTY0IOe8lueggQ==胧谈。當(dāng)然,這里隱含了以UTF-8作為字符編碼的前提荸频,如果使用了其他的字符編碼方式菱肖,用Base64編碼后就不是這個結(jié)果了。很多在線編解碼的網(wǎng)站其實(shí)也是默認(rèn)使用了UTF-8旭从,但是沒有明確說明稳强。

1.1 標(biāo)準(zhǔn) Base64 編碼步驟

下面解釋一下Base64的編碼步驟:

  • 步驟1:數(shù)據(jù)輸入
    在這一步驟,需要將原數(shù)據(jù)(字符串遇绞、圖片键袱、音頻等任何數(shù)據(jù))轉(zhuǎn)換為二進(jìn)制流。例如前面舉的字符串的例子摹闽,則需要經(jīng)過字符編碼轉(zhuǎn)換為二進(jìn)制流蹄咖。

  • 步驟2:分組轉(zhuǎn)換

    • 從二進(jìn)制流頭部開始,每 6 位為一組付鹿,若不足 6 位澜汤,則低位補(bǔ)0
    • 每 6 位組成一個新的字節(jié),高位 2 位補(bǔ) 0 舵匾,此時已經(jīng)獲得二進(jìn)制的Base64編碼
  • 步驟3:轉(zhuǎn)換為字符串
    將二進(jìn)制的Base64編碼每個字節(jié)映射為一個字符俊抵,例如0000 0000映射為 A0011 1111映射為/坐梯,此時已經(jīng)獲得Base64編碼字符串

  • 步驟4:末尾補(bǔ)位
    標(biāo)準(zhǔn)Base64編碼字符串的長度為 4 的倍數(shù)徽诲,否則,在末尾補(bǔ)充=吵血。例如前面的QmFzZTY0IOe8lueggQ==長度就是補(bǔ)充了兩個=后谎替,長度為 20。

整個編碼步驟并不復(fù)雜蹋辅,我們用一張示意圖表示為:

Base64編碼 示意圖

1.2 非標(biāo)準(zhǔn) Base64

  • Url Base 64
    標(biāo)準(zhǔn)Base 64中使用了'/'钱贯,這在URL和文件系統(tǒng)中存在沖突,因此延伸出 Url Base64 算法侦另,主要就是將'+''/'符號替換成了'-''_'符號秩命。

  • MIME Base 64
    這是一種MIME友好格式,它輸出每行為 76 個字符褒傅,每行末需追加回車換行符\r\n弃锐,不論每行是否夠 76 個字符,都要添加一個回車換行符

1.3 意義

Base64能夠?qū)⑷魏螖?shù)據(jù)轉(zhuǎn)換為易移植的字符串殿托,避免了傳輸過程中失真問題霹菊。最初,Base64是為了解決電子郵件中無法直接使用非ASCII字符的問題碌尔。一段數(shù)據(jù)先經(jīng)過Base64編碼為ASCII字符串后浇辜,可以在接收端,通過Base64解碼還原為原數(shù)據(jù)后唾戚,而無需擔(dān)心傳輸過程中失真柳洋。

很多時候,我們都將Base64編碼作為數(shù)據(jù)加密后的傳輸 / 存儲格式叹坦。例如熊镣,一段明文數(shù)據(jù)通過MD5 、SHA等手段加密后募书,經(jīng)過Base64編碼為字符串绪囱,就可以很方便地進(jìn)行傳輸 & 存儲。再比如莹捡,網(wǎng)絡(luò)上的數(shù)字證書其實(shí)也是使用Base64編碼的形式傳輸?shù)墓沓常覀兛梢栽跒g覽器上查看百度官網(wǎng)的數(shù)字證書:

查看百度官網(wǎng)的數(shù)字證書
將證書保存到本地
證書以 Base64 編碼格式存儲

需要注意的是,Base64并不是一種加密方式篮赢,明文使用Base64編碼后的字符串通過索引表可以直接還原為明文齿椅。因此,Base64只能作為一種數(shù)據(jù)的存儲格式启泣。


2. 算法實(shí)現(xiàn)

2.1 Java 環(huán)境

Java 8之前涣脚,JDK中并沒有提供Base64的算法實(shí)現(xiàn),這其實(shí)挺讓人納悶的寥茫。雖然源碼中sun.misc.BASE64Encoder遣蚀,但是它其實(shí)并不是公有 API,而是 sun 團(tuán)隊(duì)內(nèi)部使用的 API纱耻,最好不要在生產(chǎn)中使用芭梯。從Java 8,JDK 總算是補(bǔ)充了Base64的實(shí)現(xiàn)膝迎,例如:

import java.util.Base64;

標(biāo)準(zhǔn) Base 64
System.out.println(Base64.getEncoder().encodeToString("".getBytes()));

Url Base 64
System.out.println(Base64.getUrlEncoder().encodeToString("".getBytes()));

MIME Base 64
System.out.println(Base64.getMimeEncoder().encodeToString("".getBytes()));

Java 8之前粥帚,Bouncy CastleApache也提供了Base64的算法實(shí)現(xiàn)。

2.2 Android環(huán)境

Android SDK提供了Base64的算法實(shí)現(xiàn)限次,例如:

import android.util.Base64;

System.out.println(Base64.encodeToString("".getBytes(),Base64.DEFAULT));

相對于Java 8的算法實(shí)現(xiàn)芒涡,Android提供的 API 更為靈活,可以通過flag自定義控制算法的輸出卖漫。


3. 總結(jié)

  • Base 64能夠?qū)⑷魏螖?shù)據(jù)轉(zhuǎn)換為易移植的字符串费尽,避免了傳輸過程中失真問題。
  • 需要注意的是羊始,Base 64不是一種加密方式旱幼,只是一種編碼方式。很多時候突委,我們都將Base64編碼作為數(shù)據(jù)加密后的傳輸 / 存儲格式

參考資料

  • 《Java加密與解密的藝術(shù)》(第5章) —— 梁棟 著
  • 《HTTP權(quán)威指南》 —— [美] David Gourley柏卤,Brian Totty等 著
  • 《Base64》 —— 維基百科

推薦閱讀

感謝喜歡缘缚!你的點(diǎn)贊是對我最大的鼓勵勾笆!歡迎關(guān)注彭旭銳的簡書!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桥滨,一起剝皮案震驚了整個濱河市窝爪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌齐媒,老刑警劉巖蒲每,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喻括,居然都是意外死亡邀杏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門唬血,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淮阐,“玉大人,你說我怎么就攤上這事刁品∑兀” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵挑随,是天一觀的道長状您。 經(jīng)常有香客問我,道長兜挨,這世上最難降的妖魔是什么膏孟? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮拌汇,結(jié)果婚禮上柒桑,老公的妹妹穿的比我還像新娘。我一直安慰自己噪舀,他們只是感情好魁淳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著与倡,像睡著了一般界逛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纺座,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天息拜,我揣著相機(jī)與錄音,去河邊找鬼。 笑死少欺,一個胖子當(dāng)著我的面吹牛喳瓣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赞别,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夫椭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氯庆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扰付,失蹤者是張志新(化名)和其女友劉穎堤撵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羽莺,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡实昨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盐固。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荒给。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刁卜,靈堂內(nèi)的尸體忽然破棺而出志电,到底是詐尸還是另有隱情,我是刑警寧澤蛔趴,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布挑辆,位于F島的核電站,受9級特大地震影響孝情,放射性物質(zhì)發(fā)生泄漏鱼蝉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一箫荡、第九天 我趴在偏房一處隱蔽的房頂上張望魁亦。 院中可真熱鬧,春花似錦羔挡、人聲如沸洁奈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽睬魂。三九已至,卻和暖如春镀赌,著一層夾襖步出監(jiān)牢的瞬間氯哮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喉钢,地道東北人姆打。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像肠虽,于是被迫代替她去往敵國和親幔戏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353