來源:麥叔編程
作者:kevin。
JS逆向是爬蟲的難點,是爬蟲路上的攔路虎。所謂逆向就是破解網站使用的JS加密算法,拆解相關的參數。然后就可以登堂入室了。
本文總結了JS中最常用的加密算法。正所謂練武不練功,到老一場空。掌握好加密算法就是爬蟲技術的功。如果你是爬蟲是認真的,認真閱讀,收藏,討論。
偽加密算法:base64
Base64是一種用64個字符來表示任意二進制數據的方法。
問:為什么base64被成為偽加密算法?
答:使用base64將明文變成密文的操作最多算是混淆。沒有密鑰注入算法,所以只要拿到密文進行base64解密就能得到對應的明文。
當然還有一種情況就是實現base64的代碼被改寫,成為定制版的base64算法。這也沒關系,把js代碼摳出來再用Python去執行,也能將密文解密。
識別方式:由于base64的編碼的特性,要編碼的二進制數據如果不是3的倍數,最后會剩下1個或2個字節,Base64用x00字節在末尾補足后,再在編碼的末尾加上1個或2個=號,表示補了多少字節。根據這個特性,一般密文結尾處如果是'='結尾的,可以先判斷是base64編碼而成。
信息摘要算法:MD5、SHA
摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。
信息摘要算法信息摘要位數備注MD5128bit
SHA-1160bit
SHA-224224bitSHA-256的“閹割版”SHA-256256bit
SHA-384384bitSHA-512的“閹割版”SHA-512512bit
摘要算法不能被稱為加密算法,因為它是單向操作明文的。單向操作的意思就是,將明文變成‘密文’之后是無法再將'密文'變成明文(部分信息摘要算法已經被突破,可實現'密'轉明)。
基于這種單向操作的特性,摘要算法一般被用于確保信息傳輸完整一致。在爬蟲模擬登錄部分這種算法用得會比較多,舉個栗子:
假設我現在要將用戶名是kevin,密碼是123在網頁上進行登錄,瀏覽器會先通過js代碼將密碼123轉成202cb962ac59075b964b07152d234b70(MD5)再發送給服務器。服務器收到后,知道這個用戶名為kevin想要登錄,所以從數據庫中調取了kevin對應的密碼123,然后在服務器端也對123進行相應的加密(哈希)也得到202cb962ac59075b964b07152d234b70,校驗兩者一致,服務器就返回給客服端登錄成功的響應。
在實際JS逆向中哈希函數的源碼經常會被改寫,成為定制版哈希函數;還有就是在哈希過程中,明文會被加鹽值,遇到些情況就需要認真分析源碼。
加鹽:上述栗子中,只對密碼進行 md5 加密是肯定不夠的。聰明的程序員想出了個辦法,即使用戶的密碼很短,只要在他的短密碼后面加上一段很長的字符,再計算 md5 ,那反推出原始密碼就變得非常困難了。加上的這段長字符,我們稱為鹽(Salt),通過這種方式加密的結果,我們稱為加鹽 Hash。
import hashlib
md5 = hashlib.md5()
md5.update(b'123I_love_salt')
#此處的鹽值為 'I_love_salt'
print(md5.hexdigest())
207a9e3b7f1d0c08f5444c8cb92f8d85 #運行結果
識別方式:無論明文數據的長度,經過哈希之后,長度都是固定的。MD5是32位十六進制數,SHA1是40位十六進制數,SHA224是56位十六進制數等等。在獲得密文數據后,可先判斷是否是十六進制數構成,再判斷其長度是否是常見信息摘要位數。
對稱加密(加密解密密鑰相同):DES、3DES、AES
對稱加密的核心就是密鑰,拿到密鑰就等于拿到數據。也不用去管你是AES還是DES,還有多少輪加密的,拿到密鑰就用python現成的庫去實現解密。
AES密鑰長度密鑰長度對應的輪數128bit10192bit12256bit14
識別方式:密文數據的長度會隨著明文數據的長度而變化。
非對稱加密(分公鑰私鑰):RSA
對付像RSA這種非對稱加密算法,我們心中應牢記十六字方針——“公鑰加密,私鑰解密。私鑰加密,公鑰解密”。
在非對稱加密算法中,加密與解密的密鑰肯定是不一樣的(一樣的話,就不叫非對稱加密算法了)。牢記“十六字方針”后,我們只要找到‘公鑰’和‘私鑰’就能解密了。當然python也有現成的庫進行RSA解密。
識別方式:RSA公鑰加密會進行類似MD5加鹽的操作,所以相同的明文,用相同的公鑰進行RSA加密會生成不同的密文。
RSA的密鑰對不僅可能存在JS代碼中,還有很有可能會存在在html文件中。這時我們進行全局搜索關鍵詞RSA,KEY,encrypt一處處判別就會有意外收獲。
自定義加密函數
顧名思義,這種加密解密形式是非常規的,每個程序員都可以寫屬于自己風格的加密方式。對于逆向這種加密方式,我們還是摳出加密代碼就行了。
這種形式的加密方式應該算逆向中最難的,因為解密者需要去理解加密者的代碼邏輯,并避開加密者設的各種坑。最后就看誰JS玩得更6了。
補充
在實際逆向項目中MD5、SHA、AES、RSA,自定義加密函數使用頻率是最多的。而且極有可能會碰到多種不同加密算法混合使用,例如:網頁數據先base64再AES再進行base64,或者解密明文的RSA的密鑰對被AES加密了等等情況。
DES、3DES、AES、RSA、MD5、SHA傳入的數據或者密鑰都是bytes數據類型,不是bytes數據類型的需要先轉換;密鑰一般是8的倍數。
附錄參考
下面表格是把明文123用不同算法加密后的密文。相關的加密方法源碼可以在下面的知識星球獲得。






