第一种:
1、找到加密的接口地址,通过加密的接口地址全局搜索
2、通过打断点的方式,操作页面,跑到断点处时,即可找到加密串,如图二;
3、找到用的是哪种加密方式,如: crypto-js提供的AES加/解密方法,ECB模式 ,找到对应方式的加密语言加解密即可。
第二个案例参考:
第二种:
除了加解密外,还有一些签名是不能找现成的对标语言的,需要引用他们自己写的JS,前提需要找到他们关联的JS文件,然后拉下来。
引用方法;
#拉下来的sign.js文件如下: function f(t) { for (var e = p ? "0123456789ABCDEF" : "0123456789abcdef", n = "", a = 0; a < 4 * t.length; a++) n += e.charAt(t[a >> 2] >> a % 4 * 8 + 4 & 15) + e.charAt(t[a >> 2] >> a % 4 * 8 & 15); return n } function hex_hmac_md5(t, e){ return f(u(t, e)) } function sign(t) { var i = hex_hmac_md5("GTO2OINTERFACE2017#@!%88", t); return i }
#如何加载JS文件: runjs.py import execjs 2 import sys 3 import os 4 5 curPath = os.path.abspath(os.path.dirname(__file__)) 6 rootPath = os.path.split(curPath)[0] 7 sys.path.append(rootPath) 8 # 运行js文件 9 def js_from_file(): 10 with open(os.path.join(os.path.abspath(".."), "JSConfig/des3.js"), "r", encoding="UTF-8") as file: 11 result = file.read() 12 context = execjs.compile(result) 13 return context 14 15 def js_from_file1(): 16 with open(os.path.join(os.path.abspath(".."), "JSConfig/sign.js"), "r", encoding="UTF-8") as file: 17 result = file.read() 18 context = execjs.compile(result) 19 return context 20 21 def js_from_md(): 22 with open("../jsConfig/md.js", "r", encoding="UTF-8") as file: 23 result = file.read() 24 context = execjs.compile(result) 25 return context 26 27 28 if __name__ == '__main__': 29 md = js_from_md().call("md") 30 print(md)
#request.py中通过加载JS的方法去调用JS文件中的方法获取签名。 # 获取签名 def sign(self, request, requestType): data = XiangRuiBao().data(request, requestType) sign = js_from_file1().call("sign", data) #通过加载JS的方法去调用JS文件中的方法 return sign # 定义加密方法 def encrypt(self, data): bytes_str = str(data).encode('utf-8') # 将data转换为字节 bas = base64.b64encode(bytes_str).decode('ascii') request1 = '{"requestPayload":"' + bas + '"}' encrypted = js_from_file().call("encrypt", self.key, request1) #通过加载JS的方法去调用JS文件中的方法 return encrypted
参考链接:
https://blog.csdn.net/zhinian1204/article/details/124112512 加密文章
https://blog.csdn.net/cuilun000/article/details/125756232 加密文章
https://blog.csdn.net/qq_45664055/article/details/123348485?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169863513816800188585983%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169863513816800188585983&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-123348485-null-null.142^v96^pc_search_result_base9&utm_term=python%20ECB%E8%A7%A3%E5%AF%86&spm=1018.2226.3001.4187 AES加解密代码
import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad class EncryptDate: def __init__(self, key): # 初始化密钥 self.key = key # 初始化数据块大小 self.length = AES.block_size # 初始化AES,ECB模式的实例 self.aes = AES.new(self.key.encode("utf-8"), AES.MODE_ECB) # 截断函数,去除填充的字符 self.unpad = lambda date: date[0:-ord(date[-1])] def fill_method(self, aes_str): '''pkcs7补全''' pad_pkcs7 = pad(aes_str.encode('utf-8'), AES.block_size, style='pkcs7') return pad_pkcs7 def encrypt(self, encrData): # 加密函数,使用pkcs7补全 res = self.aes.encrypt(self.fill_method(encrData)) # 转换为base64 msg = str(base64.b64encode(res), encoding="utf-8") return msg def decrypt(self, decrData): # base64解码 res = base64.decodebytes(decrData.encode("utf-8")) # 解密函数 msg = self.aes.decrypt(res).decode("utf-8") return self.unpad(msg) if __name__ == '__main__': # key的长度需要补长(16倍数),补全方式根据情况而定,未补齐会报错 # key字符长度决定加密结果,长度16:加密结果AES(128),长度32:结果就是AES(256) eg = EncryptDate("asdfghjklqwertyu") # 加密字符串长同样需要16倍数:需注意,不过代码中pad()方法里,帮助实现了补全(补全方式就是pkcs7) en = eg.encrypt("测试数据") de = eg.decrypt(en) print(f"加密结果:{en}") print(f"解密结果:{de}")