Base64編碼的前世此生

Base64是一種基於64個可打印字符來表示二進制數據的表示方法。因爲2的6次方等於64,因此每6個比特爲一個單元,對應某個可打印字符。三個字節有24個比特,對應於4個Base64單元,即3個字節可表示4個可打印字符。它可用來做爲電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9,這樣共有62個字符,此外兩個可打印符號在不一樣的系統中而不一樣。一些如uuencode的其餘編碼方法,和以後binhex的版本使用不一樣的64字符集來表明6個二進制數字,可是它們不叫Base64。html

原由

計算機以二進制形式(0和1)進行通訊,可是人們一般但願與更豐富的表單數據(例如文本或圖像)進行通訊。 爲了在計算機之間傳輸此數據,首先必須將其編碼爲0和1,而後發送,而後再次解碼。 以文本爲例-有許多不一樣的方法能夠執行此編碼。 若是咱們均可以贊成一個編碼,那就簡單得多了,但不幸的是事實並不是如此。
最初建立了許多不一樣的編碼(例如Baudot碼),每一個字符使用不一樣數量的位,直到最終ASCII成爲每一個字符7位的標準。 可是,大多數計算機將二進制數據存儲在每一個字節由8位組成的字節中,所以ASCII不適合傳輸此類數據。 有些系統甚至會擦除最高位。 此外,跨系統的行尾編碼的差別意味着有時還會修改ASCII字符10和13。
爲了解決這些問題,引入了Base64編碼。 這樣,您就能夠將框架字節編碼爲已知能夠安全發送而不損壞的字節(ASCII字母數字字符和幾個符號)。 缺點是使用Base64編碼消息會增長其長度-每3個字節的數據會編碼爲4個ASCII字符。
爲了可靠地發送文本,您能夠首先使用所選的文本編碼(例如UTF-8)將其編碼爲字節,而後再對Base64進行編碼,將生成的二進制數據編碼爲可安全發送爲ASCII的文本字符串。 接收者將不得不逆轉此過程以恢復原始消息。 固然,這要求接收者知道使用了哪一種編碼,而且該信息一般須要單獨發送。
從歷史上看,它已用於對電子郵件中的二進制數據進行編碼,其中電子郵件服務器可能會修改行尾。 一個更現代的示例是使用Base64編碼將圖像數據直接嵌入HTML源代碼中。 在這裏,有必要對數據進行編碼,以免像「 <」和「>」這樣的字符被解釋爲標籤。安全

原理

base64 加密原理,是將待轉換字符串轉換爲二進制並以三個字爲一組(數據不足用 0 補足),每 6 位爲一個索引組轉換爲十進制索引,經過索引在 base64 索引表中找到對應的字符做爲編碼後的字符(若原數據長度不是 3 的倍數時則對 3 取余余數爲 1,則在編碼結果後加2個=;若餘數爲 2,則在編碼結果後加 1 個 =。)。 服務器

轉換流程
base64索引表

base64 轉換實例

以 helloworld 爲例轉換過程以下:
base64轉換實例
通過上述步驟轉後字符串爲:aGVsbG93d29ybGQ=,到此一個完整的轉碼例子便完成了。網絡

應用

base64 在須要網絡通信的場景下,有着很是普遍的應用場景,好比郵件的附件和圖象傳輸,html img 標籤的 src 屬性也能夠是 base64 編碼的圖片,還有咱們經常使用的各種證書(支付證書,ssl 證書)的公鑰和私鑰..框架

Summary

base64 是一個很優秀的編碼方式,他很好的解決了複雜文件在傳輸中的問題,也所以被普遍的應用在各類場景之中。關於 base64 的使用,你還須要知道以下幾點:編碼

  1. base64 轉碼後的長度會有所變化,會比源數據的長度多出大約 1/3
  2. base64 不具備加密特性,所以他不適用於加密的場景
  3. 因爲 base64 字符中會有 +,/ 等字符,所以若是須要 url 傳參的時候注意須要使用 URL 編碼一下,不然有可能會致使接受到的數據沒法正常解密的狀況

References

維基百科
Why do we use Base64?
What is base 64 encoding used for?加密

相關文章
相關標籤/搜索