Base64和urlencode


https://www.jianshu.com/p/b611e220ef2d

 

Base64

使用base64的初衷。是為了方便把含有不可見字符串的信息用可見字符串表示出來

我們知道在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。

而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。

Base64編碼的應用

  1. 實現簡單的數據加密,使用戶一眼望去完全看不出真實數據內容,base64算法的復雜程度要小,效率要高相對較高。

  2. Base64編碼的主要的作用不在於安全性,而在於讓內容能在各個網關間無錯的傳輸,這才是Base64編碼的核心作用。

  3. 在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字符。而在網絡上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字符,這樣出錯的可能性就大降低了。

  4. 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編碼

    如AAwww.baidu.com/img/sslm1_logo.gifZZ用Base64編碼得到QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==

    • 三、在上面得到的字符串前加上“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 了。

參考:https://juejin.im/post/5b7d50106fb9a019d7475785


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM