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)而不會有信息損失,接收方再按照對應(yīng)的規(guī)則還原回來如输。
于是鼓黔,當當當,BASE64應(yīng)運而生不见,這樣所有的二進制都可以轉(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,查表可得對應(yīng)的可打印字符过牙。
(3)當二進制字節(jié)數(shù)少于3個甥厦,即二進制bit數(shù)不是6的倍數(shù)時:二進制位數(shù)補零直到bit數(shù)為6的最小公倍數(shù)纺铭,再按6位分隔查表得到對應(yīng)的BASE64可打印字符;最后刀疙,將編碼結(jié)果用“=”補齊為4個字符舶赔。【why谦秧?為了與原碼中本來有的0進行區(qū)別】
例:將a進行BASE64編碼為YQ==
4.??BASE64的應(yīng)用場景
什么情況下需要用到BASE64編碼呢竟纳?那取決于BASE64都能做什么。經(jīng)過BASE64編碼后疚鲤,數(shù)據(jù)變成了64個ASCII編碼的數(shù)據(jù)锥累,也就是說:
?密碼均是常用可見的字符
?密碼均由64個常用字符組成
?無法一眼看出密碼的內(nèi)容
對應(yīng)的,使用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是服務(wù)器通過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不能用于信息加密!很容易破解鸟废!