日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js aes加密_某高考咨询网js逆向分析笔记

發(fā)布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js aes加密_某高考咨询网js逆向分析笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、某高考資訊網(wǎng)逆向分析

某網(wǎng)站的js加密分析,安全簽名signsafe + HmacSHA1 + AES

一年前分析過網(wǎng)站數(shù)據(jù)還沒有加密,最近需要獲取新的數(shù)據(jù)發(fā)現(xiàn)原先的爬蟲失效,請求和響應(yīng)都經(jīng)過加密。于是重新分析,記錄下分析思路以及分析過程中遇到的問題。

二、signsafe分析

2.1?抓包請求
打開谷歌瀏覽器,f12開發(fā)者模式抓包,分析請求參數(shù):抓包請求local_province_id:省份id
local_type_id:可類型,固定參數(shù),可以忽略
page:當(dāng)前頁數(shù)
school_id:學(xué)校id
signsafe:安全簽名,動態(tài)變化
size:響應(yīng)返回數(shù)據(jù)數(shù)量
url:固定值,可以忽略
year:年份
2.2 尋找signsafe加密算法
一般遇到這種明確的加密參數(shù),例如 signsafe=xxx這種,通常做法都是嘗試搜索參數(shù)名。按住ctrl+shift+f,調(diào)出搜索框,搜索關(guān)鍵詞signsafe。搜索signsafe這里只搜索到一條包含signsafe關(guān)鍵字的文件,main.75.js文件,跟進去。格式化代碼,按住ctrl+f調(diào)出文件內(nèi)搜索框,繼續(xù)搜索定位signsafe的位置。signsafe加密函數(shù)定位到疑似函數(shù),打斷點測試該函數(shù)是否就是我們需要的加密函數(shù)。斷點分析斷下來的數(shù)據(jù)可以看到,t就是請求中的signsafe參數(shù)。而且,函數(shù)中也出現(xiàn)了HmacSHA1、base64等方法。由此可知,定位的加密位置是正確的。接下來需要將加密函數(shù)摳下來改寫,方便調(diào)用。下斷點繼續(xù)跟蹤方法調(diào)用。跟蹤v.a.enc.Utf8.parse方法,如下:v.a.enc.Utf8.parse方法單步步入,繼續(xù)跟c.parse方法,如下:c.pars方法這里又出現(xiàn)了一個i.init方法,繼續(xù)跟進去,如下:i.init方法跟完v.a.enc.Utf8.parse之后,繼續(xù)跟蹤外層v.a.HmacSHA1方法,如下:v.a.HmacSHA1方法跟到這里能看出,很容易的定位加密函數(shù)位置,而且關(guān)鍵函數(shù)代碼量不多,但是代碼可讀性較差,斷點跟蹤的方式反而將問題復(fù)雜化,反思有可能是分析的方式有誤。由于網(wǎng)站應(yīng)該是經(jīng)過webpack或類似的工具打包,將多個js文件打包成一個,導(dǎo)致代碼文件冗長。仔細想想,如果是自己開發(fā)網(wǎng)站,也不可能手寫各種加密算法,極大可能是調(diào)用第三方現(xiàn)成的加密庫。如果是未壓縮前的代碼文件,必然會引用第三方的加密庫。所以轉(zhuǎn)換思路,直接搜索關(guān)鍵字require,嘗試找到引用的加密庫。ctrl+f 搜索 require,如下:搜索關(guān)鍵字require通過搜索發(fā)現(xiàn),代碼中確實引用了Crypto文件,而且查閱Crypto文檔,發(fā)現(xiàn)api函數(shù)名與加密函數(shù)中的方法一致。初步證實猜想是正確的,那么接下來安裝CryptoJs庫,照著仿寫加密流程。加密流程

梳理一下加密流程:

  • v.a為Crypto-js的引用對象;
  • 第一步:v.a.enc.Utf8.parse(e),參數(shù)e為請求的get鏈接,將utf8字符串轉(zhuǎn)換為WordArray;
  • 第二步:v.a.HmacSHA1(result, M),result為上一步中的WordArray,M為加密密鑰,打斷點可知M="D23ABC@#56",為固定值。

HMACSHA1 是從 SHA1 哈希函數(shù)構(gòu)造的一種鍵控哈希算法,被用作 HMAC(基于哈希的消息驗證代碼)。它將任意長度的字符串生成 28位長的字符串。

HMACSHA1加密返回結(jié)果
  • 第三步:v.a.enc.Base64.stringify(t).toString(),將第二步的結(jié)果進行一次base64編碼。
base64編碼
  • 第四步:t = C()(t),直觀看上去不知道函數(shù)作用,打斷點跟進去函數(shù)內(nèi)部發(fā)現(xiàn)是進行了一次md5運算。
md5加密至此,signsafe參數(shù)加密過程分析結(jié)束。先將get請求鏈接轉(zhuǎn)utf8,然后將utf8字符串轉(zhuǎn)WordArray,再進行一次HMACSHA1加密,又將結(jié)果進行base64編碼,最后再進行一次md5得到最終的signsafe結(jié)果。
2.3 代碼實現(xiàn)
弄清楚加密流程,直接調(diào)用CryptoJs庫,照著流程實現(xiàn)即可:// e get請求鏈接, M 為加密密鑰
function?initSignSafe(e,?M)?{
?let?t?=?CryptoJS.enc.Utf8.parse(e);
?let?a?=?CryptoJS.HmacSHA1(t,?M);
?let?b?=?CryptoJS.enc.Base64.stringify(a).toString();
?let?c?=?CryptoJS.MD5(b).toString();
?return?c;
}

三、響應(yīng)解碼

這個網(wǎng)站還是做了一些防護的,請求參數(shù)和響應(yīng)數(shù)據(jù)都進行了加密。上面我們分析了請求中的安全簽名加密,接下來分析響應(yīng)數(shù)據(jù)解密方法。照例抓包進行分析,摳出解密代碼。
3.1 抓包查看響應(yīng)
返回響應(yīng)抓包這一長串就是加密后的數(shù)據(jù),乍一看無從下手,但有意思的是,響應(yīng)中method的值說明響應(yīng)是通過aes-256-cbc的方式進行加密。百度解釋:

高級加密標(biāo)準(zhǔn)(AES,Advanced Encryption Standard)為最常見的對稱加密算法(微信小程序加密傳輸就是用這個加密算法的)。對稱加密算法也就是加密和解密用相同的密鑰。AES為分組密碼,分組密碼也就是把明文分成一組一組的,每組長度相等,每次加密一組數(shù)據(jù),直到加密完整個明文。在AES標(biāo)準(zhǔn)規(guī)范中,分組長度只能是128位,也就是說,每個分組為16個字節(jié)(每個字節(jié)8位)。密鑰的長度可以使用128位、192位或256位。密鑰的長度不同,推薦加密輪數(shù)也不同。

看多了太復(fù)雜,這里只需要知道使用的加密方法是aes-256,密鑰長度256位,cbc指的是在加密和解密是需要一個初始化向量(Initialization Vector, IV),在每次加密之前或者解密之后,使用初始化向量與明文或密文異或。說白了,就是設(shè)定的密鑰,添加一個初始化偏移量。加密時,明文先與iv偏移量異或,再將結(jié)果進行256位的塊加密,得到的輸出就是密文,同時本次的輸出密文作為下一個塊加密的IV。
3.2 響應(yīng)解密分析
分析思路跟signsafe參數(shù)類似,按住ctrl+shift+f,搜索關(guān)鍵字aes。搜索aes關(guān)鍵字按住ctrl+f,文件內(nèi)搜索aes關(guān)鍵字:文件內(nèi)搜索aes關(guān)鍵字有11個結(jié)果,對可疑的函數(shù)段下斷點找到加密函數(shù):斷點找到加密函數(shù)

梳理一下加密流程:

  • 第一步:將響應(yīng)中的數(shù)據(jù)賦值到變量中保存,s為安全簽名的密鑰;
  • 第二步:將兩個原始密鑰s("D23ABC@#56")和l("apidata/api/gk/plan/special")進行PBKDF2加密;

PBKDF2(Password-Based Key Derivation Function)是一個用來導(dǎo)出密鑰的函數(shù),常用于生成加密的密碼。它的基本原理是通過一個偽隨機函數(shù)(例如HMAC函數(shù)),把明文和一個鹽值作為輸入?yún)?shù),然后重復(fù)進行運算,并最終產(chǎn)生密鑰。

  • 第三步:將密文初始化為一個cipher params 對象;
  • 第四步:進行aes-256-cbc加密,傳入cipher params 對象,密鑰是經(jīng)過PBKDF2加密的s("D23ABC@#56"),偏移量lv為經(jīng)過PBKDF2加密的l("apidata/api/gk/plan/special");
  • 第五步:將aes加密后的結(jié)果WordArray轉(zhuǎn)換為字符串g.toString(v.a.enc.Utf8)。
簡而言之,將兩個密鑰進行PBKDF2加密,需要加密的數(shù)據(jù)初始化為cipher params 對象。進行一次aes256cbc加密,加密結(jié)果轉(zhuǎn)換為字符串,最終獲得解密后的響應(yīng)內(nèi)容。
3.3 代碼實現(xiàn)
復(fù)制加密流程代碼,將v.a替換為CryptoJs引用對象進行改寫:function?decodeRes(e,?_s,?_l)?{
?let?a?=?e,?s?=?_s,?l?=?_l;
?if?(e.data?&&?e.data.text)?{
??let?c?=?e.data.text;
??let?u?=?CryptoJS.PBKDF2(s,?"secret",?{
???keySize:?8,
???iterations:?1e3,
???hasher:?CryptoJS.algo.SHA256
??}).toString();
??let?f?=?CryptoJS.PBKDF2(l,?"secret",?{
???keySize:?4,
???iterations:?1e3,
???hasher:?CryptoJS.algo.SHA256
??}).toString();
??let?m?=?CryptoJS.lib.CipherParams.create({
???ciphertext:?CryptoJS.enc.Hex.parse(c)
??});
??let?g?=?CryptoJS.AES.decrypt(m,?CryptoJS.enc.Hex.parse(u),?{
???iv:?CryptoJS.enc.Hex.parse(f)
??});
??a?=?{
???code:?"0000",
???data:?JSON.parse(g.toString(CryptoJS.enc.Utf8)),
???message:?""
??}
??return?JSON.stringify(a);
?}
?return?undefined;
}
解密后的內(nèi)容如下:解密后的響應(yīng)內(nèi)容

四、總結(jié)

  • 加密參數(shù)優(yōu)先通過搜索的方式進行定位;
  • 現(xiàn)在的js文件一般都經(jīng)過壓縮,可讀性較差,可以通過搜索require等關(guān)鍵字轉(zhuǎn)換思路;
  • 摳出加密函數(shù)的方法可以通過斷點一步一步跟蹤,查缺補漏,或者手動仿寫;
  • 逆向的技巧性很強,要善于利用搜索引擎。

總結(jié)

以上是生活随笔為你收集整理的js aes加密_某高考咨询网js逆向分析笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。