https://www.jianshu.com/p/b611e220ef2d
Base64
使用base64的初衷。是為了方便把含有不可見字符串的信息用可見字符串表示出來
我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。
而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
Base64編碼的應用
-
實現簡單的數據加密,使用戶一眼望去完全看不出真實數據內容,base64算法的復雜程度要小,效率要高相對較高。
-
Base64編碼的主要的作用不在於安全性,而在於讓內容能在各個網關間無錯的傳輸,這才是Base64編碼的核心作用。
-
在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。
-
Base64 編碼在URL中的應用:
Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java持久化系統Hibernate中,就采用了Base64來將一個較長的唯一標識符(一般為128-bit的UUID)編碼為一個字符串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,采用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
然而,標准的Base64並不適合直接放在URL里傳輸,因為URL編碼器會把標准Base64中的“/”和“+”字符變為形如“%XX”的形式,而這些“%”號在存入數據庫時還需要再進行轉換,因為ANSI SQL中已將“%”號用作通配符。
(1)為解決此問題,可采用一種用於URL的改進Base64編碼,它不在末尾填充'='號,並將標准Base64中的“+”和“/”分別改成了“-”和“”,這樣就免去了在URL編解碼和數據庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,並統一了數據庫、表單等處對象標識符的格式。 (2)另有一種用於正則表達式的改進Base64變種,它將“+”和“/”改成了“!”和“-”,因為“+”,“”以及前面在IRCu中用到的“[”和“]”在正則表達式中都可能具有特殊含義。 此外還有一些變種,它們將“+/”改為“-”或“.”(用作編程語言中的標識符名稱)或“.-”(用於XML中的Nmtoken)甚至“*:”(用於XML中的Name)。
很多下載類網站都提供“迅雷下載”的鏈接,其地址通常是加密的迅雷專用下載地址。 如thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg== 其實迅雷的“專用地址”也是用Base64加密的,其加密過程如下:
- 一、在地址的前后分別添加AA和ZZ
如www.baidu.com/img/sslm1_logo.gif變成 AAwww.baidu.com/img/sslm1_l…
- 二、對新的字符串進行Base64編碼
- 三、在上面得到的字符串前加上“thunder://”就成了
thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
urlencode
url編碼主要是為了解決一些url中的一些特殊字符和歧義字符或者中文字符的傳輸問題,
不能把base64 當作 urlencode
1. base64編碼里面有一個 “+” 號,在urlecode編碼中 “+” 會被解碼成空格,urlencode時,"+" 號肯定是由空格編碼出來的,但是base64編碼的結果中 "+" 不是空格編碼出來的,如果將base64編碼作為安全的url編碼使用,則 “+” 將被解碼成空格,這是我們不願看到的; 所以不要base64編碼作為url編碼來使用.
2. 我們知道http頭里面可能會用base64編碼來傳輸一些信息,因為這些信息不會被web服務器默認做url解碼的,我們可以得到原始的編碼信息,所以http頭里面使用base64編碼是可以接受的。
用base64編碼后再進行URL編碼,再傳輸可能會避免此類問題。
Base64編碼將二進制數據按照每三個字節轉換成四個字節可讀字符,編碼后的字符長度大約為136.1%。字符范圍為 A-Z a-z 0-9 \ +。但編碼后的字符串不太適合使用URL傳輸,中文加密后的亂碼也多是因為這個原因引起:放在url中傳輸時+號會被替換成空格;並且每76個字符都會添加一個換行"\n",這個換行符合會丟失。
例如:
哈哈哈哈哈哈。。。。
會被編碼為:
uf65/rn+uf65/rn+oaOho6GjDQoNCrn+uf65/rn+uf65/qGjoaOhow0KDQq5/rn+uf65/rn+uf6h\no6GjoaM=
放在URL中傳輸時會變成(不是urlencode的意思,並沒有urlencode)
uf65/rn uf65/rn oaOho6GjDQoNCrn uf65/rn uf65/qGjoaOhow0KDQq5/rn uf65/rn uf6h
o6GjoaM=
解析肯定會出問題。
所以在傳輸和解密時要做如下處理:
1.去掉\n
2.替換空格為+
獲取到的請求數據
eyJqb3NfcGFyYW1ldGVycyI6eyJhcHBfa2V5IjoiNDUyNDJFMkU0QjA3RTNCODcyRDExNjM1MTUyRjY1MzIiLCJlbmRfZGF0ZSI6MTQ2OTgwODAwMDAwMCwiaXRlbV9jb2RlIjoiRldfR09PRFMtNDY4MTAtMSIsInVzZXJfbmFtZSI6IueIseWxi awj WumOaWueaXl iIsOW6lyIsInZlcnNpb25fbm8iOjF9fQ==
base64能取代urlencode嗎?
Base64編碼 使用的字符包括大小寫字母各26個,加上10個數字,和加號“+”,斜杠“/”,一共64個字符,等號“=”用來作為后綴用途。
其中的+, /, = 都是需要urlencode的,所以無法取代。
urlencode可以取代base64嗎?
不能,base64有轉碼功能:
由於 ASCII 碼稱為了國際標准,所以我們要把其它字符轉成 ASCII 就要用到 base64。
utf-8 -> base64(編碼) -> ASCII
ASCII -> base64(解碼) -> utf-8
這樣就可以讓只支持 ASCII 的計算機支持 utf-8 了。
