破解响应加密:Python 与 JS 逆向结合的最佳实践 | 您所在的位置:网站首页 › python加密解密进度条 › 破解响应加密:Python 与 JS 逆向结合的最佳实践 |
大家好,我是安果! 有些网站为了增强数据的安全性,针对接口的响应值做了一层加密,这样我们没法直接通过接口调用获取有效的数据 面对这种情况,我们需要分析源码,找到前端的解密逻辑,使用 Python 改写一下即可 本篇文章将通过一个简单的实例进行讲解 目标对象: aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5 具体操作步骤如下: 1-1 安装依赖 # 安装依赖 pip3 install pycryptodome1-2 分析加密逻辑 打开目标网站,通过关键字搜索数据报告,发现响应中的 data 值是加密的 ![]() 由于关键字 data 不易于全局查找解密逻辑,这里使用关键字 decrypt 在 Source 面板全局进行查询(Ctrl+Shift+F) ![]() 然后在上面搜索到的所有代码块处都新增一个断点,通过通过搜索再次触发一次请求,定位到下面的解密逻辑 我们发现解密使用的是: AES(对称加密),模式是 ECB,填充方式为 Pkcs7,另外密钥 key 通过调试也能拿到 ![]() 1-3 AES 解密(Python) 首先,利用 Python 实现 AES 的解密逻辑 import requests import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad class AESObject(object): def __init__(self, block_size=16): self.__block_size = block_size # AES解密 def aes_decrypt(self, padding: str, content: str, key: str, mode, *args): key = key.encode('utf-8') aes = AES.new(key, mode, *args) content = base64.b64decode(content) # 解密 content_raw = aes.decrypt(content).decode('utf-8') if padding == 'zero': return content_raw pad_ = ord(content_raw[-1]) return content_raw[:-pad_]然后,通过请求获取加密内容,调用上面的方法进行解密 def get_info(): url = "https://**/hhc/industry/articleWithTags?filter=%7B%22title%22%3A%221%22%2C%22keyword%22%3A%221%22%2C%22sortType%22%3Anull%2C%22limit%22%3A9%2C%22skip%22%3A0%2C%22userId%22%3A4220972%7D" payload = {} headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', 'Auth-Plus': '', 'Connection': 'keep-alive', 'Origin': 'https://**', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'clientInfo': 'web', 'clientVersion': '1.0.2', 'currentHref': 'https://**/industry', 'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'Cookie': '登录后获取的ck' } # 加密内容data data = requests.request("GET", url, headers=headers, data=payload).json()['data'] # AES加密 key = '调试拿到的key' aESObject = AESObject(block_size=16) # 解密 data_de = aESObject.aes_decrypt('pkcs7', data, key, AES.MODE_ECB) print(data_de)PS:这里只针对填充方式为 Pkcs7 做了处理,如果为其他填充模式,可以自行进行改写 如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力! 推荐阅读 5 分钟,教你从零快速编写一个油猴脚本! Python 绝招:解锁小红书信息流的无限潜力! 反爬篇 | 手把手教你处理 JS 逆向之字体反爬(下) 休闲时光:最近上映的电影与爬虫世界,带您彻底放松! |
CopyRight 2018-2019 实验室设备网 版权所有 |