網易雲音樂Ajax Post參數加密方法

首先進入網易雲音樂首頁,並且打開chrome開發者工具。在搜索欄輸入文字。

點開chrome開發者工具中的network,選中XHR,可以看到javascript剛剛發起的ajax請求。

在initiator中可以看到ajax發起方在core.js中具體的某一行。

點開某個請求,可以看到請求頭,以及返回的json字元串。

點擊initiator中具體的行數。會跳轉到具體的代碼,即整個core.js源代碼。

將其下載下來,用代碼查看工具打開,如下採用的是visual studio code。

Fiddler

利用Fiddler寫入規則。Fiddler會將剛剛下載下來的本地core.js代替伺服器的core.js進行調試。在chrome開發者工具network中需要勾選disabled cache,以防止瀏覽器利用緩存。

Fiddler中寫入規則時,有Test選項,可以進行測試,以檢查規則寫入是否正確。

發現ajax請求為post請求,form表單參數為params和encSecKey。但表單參數都進行了加密處理。

雖然整個js進行了壓縮混淆處理,但請求參數字元串一定沒有變,用visual studio code的搜索功能,可以找到enSecKey的位置。分別如下所示:

其主要的加密過程就是a,b,c,d,e函數。

在上述的所在區域中可以利用window.console.warn或者console.log輸出注入參數值。例如:

查找bsl3x,可以發現[「流淚」,」強」]等數組中的key將按如下的字典轉換為後面的16進位編碼:

紅線加入的j0x即為請求明文,在chrome中的console中可以看到輸出:

輸出的s即為明文請求,可以看出是一個json.

為了進一步查看整個加密過程,可以繼續查找,以及利用搜索引擎,發現加密主要用了Crypto.js這個加密庫,以及OHDove這個rsa加密庫(該庫誕生於1998年,支持的padding方法有限)。

為了分析Crypto.js加密的過程,可以寫一個測試文件進行調試。

先npm install Crypto安裝Crypto。OHDove的庫需要自行下載。

加密主要是d函數,d中先調用a過程生成16位的隨機字元串。然後調用一次b過程進行加密(除明文外,密鑰固定),再調用一次b過程(明文為上次加密結果,密鑰為a過程生成的16位隨機字元串)對上一次的加密結果再進行一次加密。encSecKey則是調用c過程(對a過程生成的16位隨機字元串進行加密,其他參數均固定)。

首先分析b函數。

我們可以寫一個測試文件來進行測試:

先調試CryptoJS.enc.Utf8.parse(),發現它先進行URI編碼,又使用了unescape解碼(該方法在最新的Javascript中已經不建議使用),可以認為String經過編碼,解碼後沒有變化。

之後跳轉latin1Str,將字元串轉換為數組(每4個字元串進行一組編碼)。

具體的加密過程(AES加密的詳細說明可以看blog.csdn.net/qq_282051

通過下面的注釋可以看出該方法採用的是PKCS7補位。

因此可以用python進行模擬。

Python代碼:

測試結果

之後分析OHDove的RSA庫(RSA演算法過程:blog.csdn.net/clj198606)。

網易雲音樂的加密公鑰是16進位編碼的,可以直接轉換成16進位數。

OHDove有一份注釋詳盡的源代碼。通過閱讀源代碼,可以看出其支持三種padding方式:

① 明文在拆分成塊時,後面不足的全部補0。(該方法如果不轉換成二進位塊,相當於放大了原明文轉換的16進位整數,直接用書本方法進行加密運算,速度更慢。而且補0的個數未知,需要計算)

② 明文在拆分成塊時,明文先進行倒序,然後在前面補0,相當於①方法倒過來。(該方法實現起來簡單,可以直接將明文轉換成16進位大整數m,由於在前面補0,並不增加大整數的大小。以及將publickey和module字元串轉換成16進位整數,利用書本中的基本加密公式:m^publickey mod module直接得到加密後的整數,最後將加密後的整數再進行16進位編碼,即可得到密文。由於沒有採用二進位分塊運算,計算速度不快)

③ 採用PKCS1_5的pad方法。(該方法如果不採用二進位塊運算,實現起來困難。採用PyCrypto庫,利用construct方法生成rsa對象,利用PyCrpto自帶的PKCS1_5 RSA方法加密,發送給伺服器時,無法得到返回結果。伺服器可能無法對其進行RSA解密。由於PyCrypto為了計算速度,其中加密具體過程是已經進行了編譯的pyx文件,無法直接分析過程。所以該方法難以使用。)

最後總結,用python的requests庫來進行測試。

調試窗口:

控制台輸出

具體代碼見:github.com/leo0309/wang

推薦閱讀:

為什麼說密文鏈接模式已經喪失安全性?
大神們幫忙解一下這串密碼,應該是四方或者二方密碼(我也不知道對不對)?
AES加密標準怎麼樣?

TAG:python爬蟲 | 加密解密 |