網易雲音樂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加密的詳細說明可以看http://blog.csdn.net/qq_28205153/article/details/55798628)
通過下面的注釋可以看出該方法採用的是PKCS7補位。
因此可以用python進行模擬。
Python代碼:
測試結果
之後分析OHDove的RSA庫(RSA演算法過程:http://blog.csdn.net/clj198606061111/article/details/9090407)。
網易雲音樂的加密公鑰是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庫來進行測試。
調試窗口:
控制台輸出
具體代碼見:https://github.com/leo0309/wangyiyunMusicAjaxAnalysis
推薦閱讀:
※為什麼說密文鏈接模式已經喪失安全性?
※大神們幫忙解一下這串密碼,應該是四方或者二方密碼(我也不知道對不對)?
※AES加密標準怎麼樣?