讓你徹底理解base64是怎麼回事

HTTP將BASE64-編碼用於基本認證和摘要認證,在幾種HTTP擴展中也使用了該編碼。數組

Base-64編碼保證了二進制數據的安全

Base-64編碼能夠將任意一組字節轉換爲較長的常見文本字符序列,從而能夠合法地做爲首部字段值。Base-64編碼將用戶輸入或二進制數據,打包成一種安全格式,將其做爲HTTP首部字段的值發送出去,而無須擔憂其中包含會破壞HTTP分析程序的冒號、換行符或二進制值。
Base-64編碼是做爲MIME多媒體電子郵件標準的一部分開發的,這樣MIME就能夠在不一樣的合法電子郵件網關之間傳輸富文本和任意的二進制數據裏。Base-64編碼與將二進制數據文本化表示的uuencode和BinHex標準在本質上相似,但空間效率更高。瀏覽器

8位到16位

Base-64編碼將一個8位子節序列拆散爲6位的片斷,併爲每一個6位的片短分配一個字符,這個字符是Base-64字母表中的64個字符之一。這64個輸出字符都是很常見的,能夠安全地放在HTTP首部字段中。這64個字符中包括大小寫字母、數字、+和/,仍是用裏特殊字符=
注意:因爲base64編碼用了8位字符來表示信息中的6個位,因此base64編碼字符串大約比原始值擴大了33%。
此處輸入圖片的描述安全

1

下面是一個簡單的base64編碼實例。在這裏,三個字符組成的輸入值「Ow!」是base64編碼的,獲得的是4個字符的base64編碼值「T3ch」。它是按如下方式工做的。編碼

  • (1) 字符串"Ow!"被拆分紅3個8位的字節(0x4F、0x7七、0x21)。spa

  • (2) 這3個字節構成了一個24爲的二進制01001111 01110111 00100001。3d

  • (3) 這些爲被劃分爲一些6位的序列0100十一、1101十一、011100、1000001.code

  • (4) 每一個6位值都表示了從0~63之間的數字,對應base64字母表中的64個字符之一。獲得的base64編碼字符串是4個字符的字符串「T3ch」。而後就能夠經過線路將這個字符串做爲「安全的」8位字符傳送出去,由於只用了一些移植性最好的字符(字母、數字等)。blog

// 如今將字符串"Ow!"轉換爲base64編碼值
var str = 'Ow!';
// 或去字符串的二進制碼
var binary = [];
for (var i = 0; i < str.length; i++) {
    // 轉換爲二進制表示
    var binStr = str.charCodeAt(i).toString(2);
    // 將獲得的二進制放入數組中獲得
    // ['1001111','1110111','100001']
    // 由於一個正常的二進制字節都是由8bit組成的,不夠8bit的話不表示.上面獲得的都不夠8bit因此前面咱們手動給補0,就獲得了
    // ['01001111','01110111','00100001']
    binary.push(binStr);
}
        
// 1 把字符串按照6位分開,進行分割,獲得['010011','110111','011100','1000001']
// 2 將每個轉換爲十進制分別對於[19,55,28,33];
// 3 將每一位數字分別對於上面提供的base64對應表,獲得對應的編碼,分別對於 T 3 c h
// 4 最後就會獲得base64編碼T3ch
console.log('字符"Ow!"最後獲得的base64編碼爲"T3ch"');

base64填充

base64編碼收到一個8位字節序列,將這個二進制序列流劃分紅6位的塊。二進制序列有時不能正好平均地分爲6位的塊,在這種狀況下,就在序列末尾填充零位,使二進制序列的長度成爲24的倍數(6和8的最小公倍數)。
對已填充的二進制進行編碼時,任何徹底填充(不包括原始數組中的位)的6位組都有特殊的第65個符號"="表示。若是6位組是部分填充的,就將填充位設置爲0.
下面會寫一個填充實例。初始輸入字符串爲"a:a"爲3個字節(24位)。24是6和8的倍數,所以按照上面給出的例子計算。無需填充就會獲得base64編碼爲"YTph"。
然而,再增長一個字符,輸入字符串變爲"a:aa",轉換爲二進制就會有32位長。而6和8的下一個公倍數爲48.所以要添加16爲的填充碼。填充的前4位是與數據位混合在一塊兒的。獲得的6位組01xxxx,會被看成010000、十進制中的16,或者base64編碼的Q來處理。剩下的兩個6位組都是填充碼,用=來表示。圖片

  • a:a -- 011000 010011 101001 100001 -- YTph開發

  • a:aa -- 011000 010011 101001 100001 011000 01xxxx xxxxxx xxxxxx -- YTphYQ==

  • a:aaa -- 011000 010011 101001 100001 011000 010110 0001xx xxxxxx -- YTphYWE=

  • a:aaaa -- 011000 010011 101001 100001 011000 010110 000101 1000001 -- YTphYWFh

最新的瀏覽器提供了自動生成base64的方法atobbtob

btoa('a:a')
// => "YTph"
atob('YTph')
// => "a:a"

但願此文能夠幫助你徹底理解BASE-64。

相關文章
相關標籤/搜索