附:完整筆記目錄~
ps:本人小白,筆記均在個人理解基礎上整理,若有錯誤歡迎指正!
4.2 編碼加密
-
引子:上一篇主要對常見資料傳輸型別做了總結,而本篇則對資料常見的編碼&加密方式進行總結。
-
概述:編碼&加密除了對後端敏感資料的保護,其在前端資料傳輸時往往也會被應用到。
根據上一篇的學習,我們可以注意到,除二進位制格式外,其餘大部分傳輸格式中資料都是明文傳輸,這導致其向服務端傳遞的資料可以被任何人隨意修改,也給了攻擊者攻擊的可能。
為了避免這種情況的發生,開發者往往會先對需要傳遞的資料進行編碼&加密再傳輸。這樣當攻擊者想要修改傳遞的資料時,必須也依據開發者所規定的編碼&加密方式先對payload進行編碼加密,提高了門檻,增加了攻擊難度。 -
編碼&Base64
-
概念:Base64編碼會將每三個位元組的二進位制資料轉換為4個字元的ASCII文字。
-
例子
原資料:
sjjjjjjer 666
編碼後資料:
c2pqampqamVyIDY2Ng==
-
特徵
- 明文越長編碼後文字越長
- 大小寫區分,數字&字母組合
- 編碼後,一般不會存在 / 和 + ,且文字末可能會存在兩個=
-
-
編碼&URL
-
概念:URL編碼用於將URL中非ASCII字元或特殊字元轉換為以 % 開頭的編碼,因此也稱百分號編碼。
-
例子
原資料:
example.com/sjjjjjjer 666.html
編碼後資料:
example.com%2Fsjjjjjjer%20666.html
-
特徵
URL格式再帶 % ,基本均為URL編碼。
-
-
加密&雜湊演算法
-
概念:雜湊演算法透過單向函式將資料轉換為固定長度的字串。常見的雜湊演算法如MD5、SHA等,以32位MD5為例。
-
例子
原資料1:
sjjjjjjer 666
加密後資料1:
49d8622c7fd08ed03638ee7228bf697a
原資料2:
sjjjjjjer
加密後資料2:
3c81489c7d3a09c6ad3eb60d9052d6c2
-
特徵
- 固定位數,MD5加密為16或32位。
- 16進位制字串,即由 0-9 a-f 組成。
- 單向函式加密造成MD5演算法不可逆,因此僅能透過密文碰撞破解。
-
-
加密&對稱加密
-
概念:最傳統加密方式,加解密共用同一金鑰。常見的對稱加密演算法,如AES、DES、3DES等,由於AES更為可靠(金鑰最低位數為128位),因此也是如今使用最多的對稱加密方式。本篇以AES為例。
-
例子
使用AES加密時,不僅僅需要雙方規定金鑰,同樣也需規定偏移量、加密模式、填充。由於加密模式&填充僅有固定的幾種型別,因此在對稱加密中除金鑰外最重要的也就是偏移量了。
原資料:
sjjjjjjer 666
金鑰:
1234567890abcdef
偏移量:
1234567890abcdef
加密模式&填充:
ECB&zeropadding
加密後資料(以Base64輸出):
rG0zMqyClmJE9Ldmj6BWQQ==
-
特徵
基本同Base64,但密文一般會出現 / 和 + 。
-
-
加密&非對稱加密
-
概念:與對稱加密不同,非對稱加密加解密採用一對金鑰,一般情況下使用公鑰進行加密,私鑰解密(公鑰公開,私鑰保密)。但這並不意味著僅能使用公鑰加密,在非對稱加密中私鑰也可以用來加密,相應的應使用公鑰解密,這也是我們常說的私鑰簽名,公鑰驗籤。
常見的非對稱加密演算法,RSA(最著名)、ECC(基於橢圓曲線...)。本篇以RSA為例 -
例子(公私鑰為平臺示例)
原資料:
sjjjjjjer 666
公鑰:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDHc+PP8LuTlBL1zCX+lh9kcur gHHIXFnV/tDK789DaJuhwZvQ1lu5Zdcn+ULbNUKkB6b5tCP0sZxlpoCVKMyKHtde h/YGXwBD8sMc+XcRs0eh3/tyr4EoBu3bomzHWDGmHjH/F5GotFTrGcB6xQwAROy4 mT5SketlQ3c7tucI+QIDAQAB -----END PUBLIC KEY-----
加密後資料(以base64輸出):
XJvQMLNI8355fRZ/1SE33DjtwmX4zWFezYSesV/lD6JLv6amBoaodg5lyZd+vOZos603l19j3tjb9NnnguXYd3MCuyw33Y4FtjuVeRlnuBc/ddWvHlR19LJcuZbSMy/id1twJa8CFKDOskeN87SmwzHpLD289pMtlEmop/F7Xn8=
私鑰:(詳見平臺,實在太長了就不粘了)
解密後資料:
sjjjjjjer 666
-
特徵
基本同AES,但密文長度較長。
補:線上對稱&非對稱加解密平臺,http://tool.chacuo.net/cryptrsapubkey
-
-
加密&自定義
-
概念:開發者自定義加密演算法(一般基於非對稱/對稱加密改良),往往被應用於加密傳輸資料。
-
例子(以某通登入框為例)
顯然,這種密文格式並不符合我上述所提到的幾種,稱這種加密方式為自定義加密。那當我們遇到這種加密方式該怎麼辦呢?
由於所有加密操作均在發包前也就是前端實現,那我們能不能透過除錯找到前端開發者自定義的加密演算法程式碼呢,若能成功找到,是不是就可以利用開發者的加密程式碼加密我們的payload,從而繞過自定義加密進行測試呢。這也是我們所常說的JS逆向。
-
-
總結&再擴充套件
由上文的介紹,我們對不同的編碼&加密方式有了基本的認知,那當遇到了編碼加密的情況時該如何解決呢?由於編碼&加密往往存在兩種應用場景,因此分別對這兩種場景進行討論。資料型別/應用場景 後端敏感資料 前端資料加密傳遞 編碼(Base64) 反編碼 payload Base64編碼 雜湊加密(MD5) 線上平臺/指令碼碰撞解密 payload MD5加密 對稱加密(AES) 找金鑰&偏移量,逆向解密 前端找金鑰&偏移量加密payload 非對稱加密(RSA) 找私鑰,同上 前端找公鑰加密payload 自定義加密 後端找解密演算法??? 前端找加密演算法,利用開發者自己的演算法加密
(注:上述加密型別也可用該方法,依據實際情況選擇)