What Is Base64

written | in encrypt | comments

在從事web開發時,一定常常聽到base64,例如:rails裡會將cookie值採用base64編碼保護,而且在rails使用base64也相當容易,如:

rails使用base64
1
2
3
4
   encrypted_code = Base64.encode64 "Hello World"
  # 輸出 "SGVsbG8gV29ybGQ=\n"
  Base64.decode64 encrypted_code
  # 輸出 "Hello World"

看起來似乎非常簡單使用跟沒什麼特別要學的成本,所以本篇教完了,結束……..!?
當然沒這麼簡單,學習一項事物時,我覺得除了事物本身外,更重要的是我們為何要學習它?甚至去了解它的由來,我覺得對學習可以有更深的幫助,也較有趣味性。所以接下來我會講解base64的蓋要與它的使用目的。


Base64由來:

Base64的由來與電子郵件格式息息相關,最初在八零年代時(1982年RFC822規範文件)定義了傳統的電子郵件格式,而那時規定了只能傳輸ASCII,而這也導致了

  • 非英語字元不能在電子郵件中使用
  • 電子郵件裡不能插入二進位檔案
  • 電子郵件無法攜帶檔案附件

而為了解決這個問題,90年代後工程師拓展了電子郵件的技術規範、並提出補充,造就了MIME的出現,以及為了轉換二進位制文件為ASCII字符而生的編碼,Base64等編碼方法的出現。


Base64介紹:

Base64的介紹及原理在維基百科裡其實已經有詳細的講解及過程,在這我仍然簡單的介紹原理及運算並以維基百科提供的資料為參照。

Base64的64的由來是由0~9+A~Z+a~z++/等64個字元所組成,而64為2的6次方,所以以6的位元為1個單位,因此如果3個byte共24位元長度得資料則除以6變成4個Base64字元,長度因此增加了1/3的長度。若字元長度無法被6整除則會再補上0位元,並再最後產生的結果莫段加上1或2=字元符號(依補多少個0而定),因此前面才會說長度增加大約為1/3。

而算法的過程為

  1. 將文字轉為ASCII編碼
  2. 將ASCII編碼轉為二進位制
  3. 以6個字元為一組,若長度不夠被六整除則在最右邊補上0字元直到可被6整除
  4. 得到新的以6個字元為長度後則在最左邊補上2個0使之轉為二進位制資料並求出值
  5. 根據該值去對Base64編碼做索引
  6. 若在步驟3有補了4個0就要在最後結果尾端補上2個=,若2個0就要在最後結果尾端補上1個=

範例:

Bar

  1. 66, 97, 114
  2. 01000010, 01100001, 01110010
  3. 010000, 100110, 000101, 110010
  4. 0010000(16), 00100110(38), 00000101(5), 00110010(50)
  5. Base64表後得到QmFy即為所求
  6. 步驟3沒有補0故此步驟不需要做

最終結果為Qmfy比本來的Bar長度多了1/3。

等等

但是我們這只是用英文轉啊?!好像沒有意義。如果想轉中文怎麼辦?其實只有一開始多增加了一些步驟,要先根據漢字編碼如採用的是utf-8orGBK等不同編碼,先轉為二進位制再帶入上面的過程則可求得該漢字的Base64結果。

若不會把漢字依據UTF-8轉為二進位制的話,可以來這邊轉。


Base64目的與運用:

到這裡我們對base64已經有大致了理解,base64的主要目的就是將非ASCII字元轉為可列印字符,所以我們也來看看這可以適合應用在哪些地方

  • 電子郵件的格是轉換
  • 可避免二進位制檔案在網路傳輸過程中因某些格式或是協定將部分內容視為特殊符號而造成的遺漏或失真
  • HTTP請求中可將較長的資訊編碼後放在url參數或表單中,同樣可避免特殊符號造成的影響
  • 隱藏資訊的可讀性(但Base64不能視作加密方法,因為可以被解譯)
  • Data URI(HTML中可直接攜帶二進位制檔案,並且透過MIME所使用)

除了上述當然也還有其他得應用,但常見的幾個大概就是這樣,到這邊希望大家對Base64的使用疑惑已經解開了,如果有什麼對Base64的心發現或是我文章中有不對的地方都歡迎大家分享或指教~

參考

Base64笔记


Comments

blog comments powered by Disqus