X.509公鑰證書也好,電子郵件數據也好,經常要用到Base64編碼,那么為什么要作一下這樣的編碼呢?
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
對證書來說,特別是根證書,一般都是作Base64編碼的,因為它要在網上被許多人下載。電子郵件的附件一般也作Base64編碼的,因為一個附件數據往往是有不可見字符的。
那么Base64到底是怎樣編碼的呢?
簡單來說,任何一個數據無非可以看作一個比特流,如01000100010011101100111010111100011001010......那么我們取6個比特為一組,計算它的ascii值,得到一個字符,這個字符肯定是可見字符,好,把它對應的字符寫出來,再取6個比特,計算...,如此下去,直到最后,就完成了編碼。
1.標准base64只有64個字符(英文大小寫、數字和+、/)以及用作后綴等號;
2.base64是把3個字節變成4個可打印字符,所以base64編碼后的字符串一定能被4整除(不算用作后綴的等號);
3.等號一定用作后綴,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在后面添加\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然添加等號的數目只能是0、1或2;
4.嚴格來說base64不能算是一種加密,只能說是編碼轉換。使用base64的初衷。是為了方便把含有不可見字符串的信息用可見字符串表示出來,以便復制粘貼;
---------------------------------------------------------------------------------------------
提供一個工作中用到過的base64場景
一個xml當中包含另一個xml數據,此時如果將xml數據直接寫入顯然不合適,將xml進行適當編碼存入較為方便,事實上xml當中的字符一般都是可見字符(0-127之間),但是由於中文的存在,可能存在不可見字符,直接將字符打印在外層xml的數據中顯然不合理,那么怎么辦呢?
可以使用base64進行編碼,然后存入xml,解碼反之
其實還有個辦法,將byte的值寫在xml當中,空格或者,分開,這樣也可以將byte數據傳入,不過這樣更浪費空間,並且不易保存.
另一個,比如http協議當中的key value字段,必須進行URLEncode 不然出現的等號可能使解析失敗 空格也會使http請求解析出現問題,比如 請求行就是以空格來划分的 POST /guowuxin/hehe HTTP/1.1
又比如有些文本協議不支持不可見字符的傳遞,只能用大於32的可見字符來傳遞信息(協議規定)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
最重要的是
1.便於網絡傳輸。
2.不可見性。
(一)Encoding VS. Encryption
很多人都以為編碼(Encoding)和加密(Encryption)是同一個意思。編碼和加密都是對格式的一種轉換,但是它們是有區別的。編碼是 公開的,比如下面要介紹的Base 64編碼,任何人都可以解碼;而加密則相反,你只希望自己或者特定的人才可以對內容進行解密。
(二)Base 64編碼
Base 64 Encoding有什么用?舉個簡單的例子,你使用SMTP協議 (Simple Mail Transfer Protocol 簡單郵件傳輸協議)來發送郵件。因為這個協議是基於文本的協議,所以如果郵件中包含一幅圖片,我們知道圖片的存儲格式是二進制數據(binary data),而非文本格式,我們必須將二進制的數據編碼成文本格式,這時候Base 64 Encoding就派上用場了。
Base64編碼的作用:由於某些系統中只能使用ASCII字符。Base64就是用來將非ASCII字符的數據轉換成ASCII字符的一種方法。它使用下面表中所使用的字符與編碼。
而且base64特別適合在http,mime協議下快速傳輸數據。
base64其實不是安全領域下的加密解密算法。雖然有時候經常看到所謂的base64加密解密。其實base64只能算是一個編碼算法,對數據內容進行編碼來適合傳輸。雖然base64編碼過后原文也變成不能看到的字符格式,但是這種方式很初級,很簡單。
X.509公鑰證書也好,電子郵件數據也好,經常要用到Base64編碼,那么為什么要作一下這樣的編碼呢?
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
可以使用base64進行編碼,然后存入xml,解碼反之
其實還有個辦法,將byte的值寫在xml當中,空格或者,分開,這樣也可以將byte數據傳入,不過這樣更浪費空間,並且不易保存.
另一個,比如http協議當中的key value字段,必須進行URLEncode 不然出現的等號可能使解析失敗 空格也會使http請求解析出現問題,比如 請求行就是以空格來划分的 POST /guowuxin/hehe HTTP/1.1
又比如有些文本協議不支持不可見字符的傳遞,只能用大於32的可見字符來傳遞信息(協議規定)