token要加編碼decode嗎_徹底弄明白Base64 編碼

Base64 encoding/decoding常見于各種authentication和防盜鏈的實現當中。徹底搞懂它絕對提升團隊troubleshooting的底氣。我們從純手工方式編碼解碼開始,然后看看學到的技能怎么樣應用在實際的troubleshooting 中。

準備工作:我們應知道一個byte有8個bits,并且知道怎么表示它。

我們應該comfortable with hex, binary and decimal 之間的conversion.

有一張現成的ASCII table. (網上有很多,我下面附一個直接帶binary value的)

Base64 Table

Base64 Encoding的原理

大白話是這樣。給定一個bits序列,從最左開始,按順序每6-bit 為一組進行分組,這樣每一組可以表示最多2的6次方,也就是64個字符。這是為什么它叫Base64的原因。

這樣分組,最后即最右邊的一組如果正好有6-bit, 分組就完成。如果不夠6-bit, 就要做一個alignment / padding的處理。有兩步。第一步,用binary 0 (bit 的值為0)補齊到6-bit. 如果補過的bit 序列正好落在byte boundary,則分組完畢;如若不然,繼續第二步,補到下一個最近的byte boundary, 不過不是用0去pad, 而是用等號字符“=”, 用1個或者2個等號去補, 別忘了,一個等號占6個bits.

用數學的方式正規一點的描述是這樣。

給定一個長度為L的bit 序列,L可以被8整除 ( 這也是byte boundary含義), 我們需要找到兩個正整數M和N, 使得: L <= M <= N, 其中 M要能夠被6整除, N is either L or L + 8.

根據這個描述可以得出下面這些結論:最后得到的長度為N的bit 序列也是落在byte boundary上,即N可以被8 整除。

L除以6的余數只有三種可能: 0,2, 4, 對應于三種不同的padding scenarios.

M - L 的 值只可能為: 0, 2, 4, 道理同上

N – M的值只可能為: 0, 6,12, 同樣的,這是對應于三種不同的padding scenarios.

純手工Base64編碼

Given an input string “a”,

Step 1: 將它convert 成 bit 序列

查ASCII table, 我們得到它的binary value 即 bit 序列: 01100001

這是一個長度為8的初始序列。

Step 2: 按6個bits 一組分組

011000 01

Step 3: 最右組只有2 個bit, 不夠6 bits, 需要補4個0

011000 010000

至此我們可以得到兩個字符:

011000 = 2 ** 4 + 2 ** 3 = 16 + 8 = 24, 查Base64 table, 對應于24的字符是 Y.

010000 = 2 ** 4 = 16, 同樣查Base64 table, 對應于16的字符是 Q

很多Base64的實現,到這就結束了。小寫 a, 經過Base64編碼之后就是YQ.

Step 4: 這原始bit 序列長度為8, Step 3補了4個0, 變成12,不能被8整除,繼續補。

我們知道從12開始,下一個被8整除的值是24, 所以我們要補24 – 12 = 12個bits. 在這種情況下我們補等號字符,一個字符占6 bits,所以我們補兩個”= “.

如果做了這一步,小寫 a, 經過Base64編碼之后就是YQ== .

純手工Base64 解碼

Given YQ==,

Step 1: 去掉“=”的padding, 得到 YQ, 同時知道pad了12 bits 到byte boundary.

Step 2: 根據Base64 table convert “YQ” to bit 序列 011000 010000

Step 3: 去掉 最右邊pad的4個0

因為原始字符也就是要decode過去的字符是跳 8的,現在有12 bits, 很快可以確定最右4 bits 是padding.

從這種工作方式我們可以看到,既然最右4 bits無論如何都是要去掉的,這4 bits 可以是任何2 ** 4 = 16個值中的一個,而不影響decoding的結果。舉幾個例子:

0110000 010001 = YR

0110000 010010 = YS

0110000 010011 = YT

0110000 011110 = Ye

0110000 011111 = Yf

下面是用Python Bas64 module decoding的結果,驗證上面所講。

>>> base64.b64decode("YR==")

'a'

>>> base64.b64decode("YT==")

'a'

>>> base64.b64decode("YU==")

'a'

>>> base64.b64decode("YV==")

'a'

>>> base64.b64decode("YW==")

'a'

>>> base64.b64decode("YY==")

'a'

>>> base64.b64decode("YZ==")

'a'

>>> base64.b64decode("Ya==")

'a'

>>> base64.b64decode("Yb==")

'a'

>>> base64.b64decode("Yf==")

'a'

>>> base64.b64decode("Ye==")

'a'

>>>

Step 4: 按8-bit 分組, 得到 011000 01, 這個就是”a”.

實例分析

Linkedin發現如果他們修改防盜鏈token的最后一位,authentication仍然可以通過,要我們解釋。

Token in question是這樣的:

bs3xODAExQFZthY2LF1EqbuVtq4veLftiHILz3pXn13Ai5DzRYmdCZ8O9FAQwI4zceyBpEJO6secbKz9rGNMfBVeNaplwLNVqQwAXSR-grVQGJkz91pqdmVBbrwCpGto5IazBV8XDMJUIGCGZOdld2REqemD4cvDoLdeN3itZirB2FGfMHPxhP0

如果把末尾0換成1,2, 3, authentication 仍舊可以通過。

前面學到的東西可以馬上應用。思路是這樣的:

Token 長度為183, 所以bit 序列的長度為183 * 6 = 1098. 因為1098 沒有落在byte boundary, 我們可以立即確定encoding 的Step 4省略了,即沒有pad “=”.

因為1098 / 8 = 137 r2, 我們可以確定 最右的2 bit 是padding. 如前所述, 這兩個bits 可以是 任何 2 ** 2 = 4個值中的一個,而不影響decoding的結果。

00 = 0

01 = 1

10 = 2

11 = 3

至此Linkedin 的問題徹底解釋清楚。

讀了這一篇,你應該可以回答為什么有的Base64-encoded的values 末尾沒有等號,有的有一個等號,有的有兩個等號,以及為什么多個values會decode到相同的value. If necessary, you should be able to base64 encode and decode pretty much anything MANUALLY.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle的oradata,Oracle使用oradata恢復數據庫

SQL> host del D:\oracle\ora92\database\PWDoracle.ORASQL> host orapwd fileD:\oracle\ora92\DATABASE\PWDoracle.ORA passwordsystem entries10SQL> alter database open;數據庫已更改。SQL> conn system/system as sysdba已連接。SQL> shutdown immediate數…

Jenkins連接TFS出現錯誤:“jenkins com.microsoft.tfs.core.exceptions.TECoreException”的問題收集...

沒成功解決過&#xff0c;下面提供一些收集的鏈接地址&#xff0c;因為這個問題真的很少。 https://social.msdn.microsoft.com/Forums/vstudio/en-US/1a75a0b2-4591-4edd-999a-9696149c8144/integration-with-jenkins?forumtfsintegration http://www.itgo.me/a/900879197026…

leetcode842. 將數組拆分成斐波那契序列(回溯)

給定一個數字字符串 S&#xff0c;比如 S “123456579”&#xff0c;我們可以將它分成斐波那契式的序列 [123, 456, 579]。 形式上&#xff0c;斐波那契式序列是一個非負整數列表 F&#xff0c;且滿足&#xff1a; 0 < F[i] < 2^31 - 1&#xff0c;&#xff08;也就是…

react fiber_讓我們愛上React Fiber

react fiberby Ryan Yurkanin瑞安尤卡寧(Ryan Yurkanin) 讓我們愛上React Fiber (Let’s fall in love with React Fiber) TLDR, React Fiber is an internal engine change that allows React to break the limits of the call stack. It’s creation enables React to pause…

Ajax爬取豆瓣電影目錄(Python)

下面的分析相當于一個框架&#xff0c;搞懂之后&#xff0c;對于類似的文字爬取&#xff0c;我們也可以實現。就算不能使用Ajax方法&#xff0c;我們也能夠使用相同思想去爬取我們想要的數據。 豆瓣電影排行榜分析 網址&#xff1a;https://movie.douban.com/explore#!typemovi…

到底死不死我就請了七天假_“你到底死不死?我只請了7天假”

這兩天看到一條令人心酸的新聞&#xff0c;在國內某地鐵站內&#xff0c;一位57歲的大媽突發心臟病&#xff0c;被緊急救醒后&#xff0c;第一句話竟是請求工作人員不要打電話通知她遠在德國的兒子。看完這條新聞&#xff0c;掌柜特別心酸&#xff0c;孤身一人在國內&#xff0…

正面管教PHP沙龍,正面管教沙龍體會

接觸到正面管教這個理念是我們南寧行動派伙伴圈 的圈主西西給大家帶來的分享&#xff0c;謝謝西西[愛你]圖片發自簡書App同時也很感謝親切溫柔&#xff0c;知性優雅的Liliane老師&#xff0c;讓我明白表揚和鼓勵的區別&#xff0c;非暴力教育……教書育人這個道路上我需要學習的…

FB面經Prepare: Dot Product

Conduct Dot Product of two large Vectors 1. two pointers 2. hashmap 3. 如果沒有額外空間&#xff0c;如果一個很大&#xff0c;一個很小&#xff0c;適合scan小的&#xff0c;并且在大的里面做binary search 1 package fb;2 3 public class DotProduct {4 5 publi…

leetcode1291. 順次數(回溯)

我們定義「順次數」為&#xff1a;每一位上的數字都比前一位上的數字大 1 的整數。 請你返回由 [low, high] 范圍內所有順次數組成的 有序 列表&#xff08;從小到大排序&#xff09;。 示例 1&#xff1a; 輸出&#xff1a;low 100, high 300 輸出&#xff1a;[123,234] …

20175223 MySQL

目錄 完成結果要求 1 &#xff1a;導入world.sql要求 2 &#xff1a;CityWanna.javaCityWanna.java要求 3 &#xff1a;CountryWanna.javaCountryWanna.java要求 4 &#xff1a;LifeWanna.javaLifeWanna.java過程中問題及解決1. XAMPP無法啟用 MySQL 程序。目錄 完成結果 要求 …

2020運動相機推薦_2020年超有價值入門級微單相機推薦,超高性價比幾款入門級微單相機(選購指南)...

學習攝影專業已經3年多啦&#xff0c;自己喜歡拍攝照片&#xff0c;自己還幫助過一些想學習攝影的朋友快速入門&#xff0c;最近發現周圍學習攝影的朋友也越來越多了&#xff0c;有一些朋友咨詢關于入門微單相機的問題&#xff0c;想讓推薦幾款不錯的入門的微單相機。這篇文章帶…

javascript入門_JavaScript代理快速入門

javascript入門What is a JavaScript proxy? you might ask. It is one of the features that shipped with ES6. Sadly, it seems not to be widely used.什么是JavaScript代理&#xff1f; 你可能會問。 這是ES6附帶的功能之一。 可悲的是&#xff0c;它似乎并未得到廣泛使用…

linux缺少文件操作數,linux 文件的atime,ctime,mtime查看與修改

查看ls -a默認顯示的是修改時間ls -c / --timestatus / --timectime顯示的是狀態修改時間(即權限修改時間)ls -u / --timeuse / --timeaccess / --timeatime表示的是文件訪問時間修改touch: 缺少了文件操作數請嘗試執行“touch --help”來獲取更多信息。[weilocalhost ~]$ touc…

leetcode47. 全排列 II(回溯)

給定一個可包含重復數字的序列&#xff0c;返回所有不重復的全排列。 示例: 輸入: [1,1,2] 輸出: [ [1,1,2], [1,2,1], [2,1,1] ] 代碼 class Solution {List<List<Integer>> cListnew ArrayList<>();public List<List<Integer>> permuteUni…

linux 磁盤查看方式

fdisk (查看物理磁盤大小) df (查看文件系統&#xff0c;也就是正在使用磁盤大小) lsblk (查看邏輯磁盤大小)轉載于:https://www.cnblogs.com/MUQINGFENG123/p/10820345.html

ioslabel陰影,UILabel的內陰影

is it possible to create such a UILabel with inner and outer shadow?i only know shadowColor and shadowOffsetzoomed:thanks!解決方案The answer by dmaclach is only suitable for shapes that can easily be inverted. My solution is a custom view that works with …

Webpack初學者介紹

Webpack is a tool that lets you compile JavaScript modules. It’s also known as a module bundler.Webpack是使您可以編譯JavaScript模塊的工具。 也稱為模塊捆綁器 。 Given a large number of files, it generates a single file (or a few files) that run your app.給…

Android Coding利器之掌握小技巧,助你Coding更上一層樓~

本文講的是Android Coding利器之掌握小技巧&#xff0c;助你Coding更上一層樓~&#xff0c;話說前幾天在網上瀏覽到一大牛寫的關于Android布局優化的文章&#xff0c;看后感觸很深&#xff0c;回過頭看看自己寫過的代碼&#xff0c;發現還是有不少需要改進&#xff0c;今天找不…

linux系統報警怎么辦,常見Linux系統故障和解決方法

常見Linux系統故障和解決方法發布時間&#xff1a;2020-06-06 14:48:19來源&#xff1a;億速云閱讀&#xff1a;212作者&#xff1a;Leah欄目&#xff1a;云計算這篇文章給大家分享的是常見的Linux系統故障和解決方法。在使用系統的過程中總會有各種各樣的故障&#xff0c;所以…

Vuex 模塊化與項目實例 (2.0)

Vuex 強調使用單一狀態樹&#xff0c;即在一個項目里只有一個 store&#xff0c;這個 store 集中管理了項目中所有的數據以及對數據的操作行為。但是這樣帶來的問題是 store 可能會非常臃腫龐大不易維護&#xff0c;所以就需要對狀態樹進行模塊化的拆分。 首先貼出一個邏輯比較…