(二)base64編碼的前世今生

1.??什么是BASE64編碼

BASE64就是一種基于64個可打印字符來表示二進制數(shù)據(jù)的方法。換句話說,就是將二進制數(shù)編碼成為64個可打印字符(符合ASCII編碼規(guī)則)。

2.??為什么會出現(xiàn)BASE64 編碼

最早的郵件系統(tǒng)只處理ASCII編碼,ASCII碼為7位有效碼,一共包括。因此舊的郵件系統(tǒng)就會以為收到的8位字節(jié)碼都是以ASCII編碼的,并不理會最高位,或者簡單粗暴的處理最高位,如:截斷最高位。

后來,郵件的內(nèi)容越來越豐富了,人們不僅想傳輸英文字符,還想傳輸如:中文(各種不同的編碼),圖片、視頻(二進制文件)等更加豐富的內(nèi)容。然而,這些內(nèi)容的編碼超出了ASCII碼的范圍,若不加以處理,這些編碼在經(jīng)過舊的郵件系統(tǒng)時,若最高位被截斷了,信息就損失了,接收方?jīng)]有辦法判斷發(fā)送過來的字符最高位是0還是1,也就無法正確還原發(fā)送方發(fā)出的數(shù)據(jù)。

怎么辦呢?很簡單,就是發(fā)送方把這些內(nèi)容按照一定規(guī)則重新編碼成符合ASCII碼格式的編碼,使其能夠順利通過那些問題郵件系統(tǒng)而不會有信息損失,接收方再按照對應的規(guī)則還原回來。

于是,當當當,BASE64應運而生,這樣所有的二進制都可以轉(zhuǎn)換成ASCII編碼格式進行傳輸了。

3.?BASE64編碼規(guī)則

1. BASE64編碼基于以下64個可打印字符:A-Z、a-z、0-9、+、/。64個字符只需要使用6個bit即可完全表示(2的6次方為64)。

2. 二進制字符串轉(zhuǎn)換成BASE64的方法是:

(1)每3個8位字符分隔為4個6位字符。(因為Base64的編碼只有6個bit即可表示,而正常的字符是使用8個bit表示, 8和6的最小公倍數(shù)是24,所以4個Base64字符可以表示3個8位字符)。

(2)在6位字符的最高2位補0,查表可得對應的可打印字符。

(3)當二進制字節(jié)數(shù)少于3個,即二進制bit數(shù)不是6的倍數(shù)時:二進制位數(shù)補零直到bit數(shù)為6的最小公倍數(shù),再按6位分隔查表得到對應的BASE64可打印字符;最后,將編碼結(jié)果用“=”補齊為4個字符?!緒hy?為了與原碼中本來有的0進行區(qū)別】

例:將a進行BASE64編碼為YQ==



4.??BASE64的應用場景

什么情況下需要用到BASE64編碼呢?那取決于BASE64都能做什么。經(jīng)過BASE64編碼后,數(shù)據(jù)變成了64個ASCII編碼的數(shù)據(jù),也就是說:

?密碼均是常用可見的字符

?密碼均由64個常用字符組成

?無法一眼看出密碼的內(nèi)容

對應的,使用BASE64密碼的動機可以歸納為:

?將不可見字符轉(zhuǎn)換為可見字符

?對消息格式進行保護

?對消息內(nèi)容進行簡單保護(防君子不防小人)

(1)將不可見字符轉(zhuǎn)換為可見字符

?網(wǎng)頁中圖片等二進制數(shù)據(jù)的BASE64編碼

(參考:http://www.webhek.com/post/data-url.html

前端在實現(xiàn)頁面時,對于一些簡單的圖片,為了避免瀏覽器加載外部資源,可以將圖片內(nèi)容直接嵌入到網(wǎng)頁里。這就是瀏覽器的Data

URLs 的特性,它可以優(yōu)化網(wǎng)站加載速度和執(zhí)行效率。圖片數(shù)據(jù)是二進制數(shù)據(jù),沒有辦法描述。使用Base64對圖片或其他文件的二進制數(shù)據(jù)進行編碼后,這些數(shù)據(jù)就變成了可見字符。

(2)對消息格式進行保護

與郵件系統(tǒng)處理非ASCII編碼會遇到的問題類似,其基本目的是保證發(fā)送方發(fā)出的內(nèi)容經(jīng)過網(wǎng)絡(luò)傳輸后能夠被正確的還原。這是處理包含特殊字符的消息最簡單有效的實現(xiàn)方式,避免了發(fā)送方和接收方對消息中的字符進行逐個處理的復雜性。

?URL與Cookie

URL通常以冒號和斜杠來對URL的內(nèi)容進行分隔。URL中還會傳遞一些用戶輸入、二進制數(shù)據(jù)等參數(shù)。當這些內(nèi)容中包含了冒號和斜杠等特殊字符時,若不加以處理,會影響WEB系統(tǒng)對URL格式的解析。因此,將參數(shù)內(nèi)容進行BASE64編碼以后再進行傳輸,就可以降低系統(tǒng)處理特殊字符的復雜性。同時發(fā)送者和接收者無須擔心傳輸?shù)膬?nèi)容會破壞HTTP分析程序的冒號、換行符或二進制值。

?Cookie

(參考:https://www.cnblogs.com/andy-zhou/p/5360107.html#_caption_0

Cookie是服務器通過HTTP頭發(fā)送給客戶端的數(shù)據(jù),為了在HTTP頭部無損的傳遞這些消息內(nèi)容,通常也需要對cookie的內(nèi)容進行base64編碼。通常在cookie中傳遞的二進制數(shù)據(jù)包括圖片、證書等。

注:由于標準的Base64編碼后可能出現(xiàn)字符+和/,在URL中就不能直接作為參數(shù),所以又有一種"url safe"的base64編碼,其實就是把字符+和/分別變成-和_。

?結(jié)構(gòu)化文本

參考:https://blog.csdn.net/qq_27274997/article/details/78215934

一個xml當中包含另一個xml數(shù)據(jù),此時如果將xml數(shù)據(jù)直接寫入顯然不合適,將xml進行適當編碼存入較為方便,事實上xml當中的字符一般都是可見字符(0-127之間),但是由于中文的存在,可能存在不可見字符,直接將字符打印在外層xml的數(shù)據(jù)中顯然不合理,那么怎么辦呢?可以使用base64進行編碼,然后存入xml,解碼反之其實還有個辦法,將byte的值寫在xml當中,空格或者,分開,這樣也可以將byte數(shù)據(jù)傳入,不過這樣更浪費空間,并且不易保存。


(3)對消息內(nèi)容進行簡單保護(防君子不防小人,防外行不防內(nèi)行),就不解釋了。

??? (參考:https://blog.csdn.net/waf1314/article/details/5107400

?

5.?BASE64的誤用

BASE64不能用于信息加密!很容易破解!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容