前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >破解响应加密:Python 与 JS 逆向结合的最佳实践

破解响应加密:Python 与 JS 逆向结合的最佳实践

作者头像
AirPython
发布2023-08-22 08:24:16
6510
发布2023-08-22 08:24:16
举报
文章被收录于专栏:Python 自动化
大家好,我是安果!

有些网站为了增强数据的安全性,针对接口的响应值做了一层加密,这样我们没法直接通过接口调用获取有效的数据

面对这种情况,我们需要分析源码,找到前端的解密逻辑,使用 Python 改写一下即可

本篇文章将通过一个简单的实例进行讲解

目标对象:

aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5

具体操作步骤如下:

1-1 安装依赖

代码语言:javascript
复制
# 安装依赖
pip3 install pycryptodome

1-2 分析加密逻辑

打开目标网站,通过关键字搜索数据报告,发现响应中的 data 值是加密的

由于关键字 data 不易于全局查找解密逻辑,这里使用关键字 decrypt 在 Source 面板全局进行查询(Ctrl+Shift+F)

然后在上面搜索到的所有代码块处都新增一个断点,通过通过搜索再次触发一次请求,定位到下面的解密逻辑

我们发现解密使用的是: AES(对称加密),模式是 ECB,填充方式为 Pkcs7,另外密钥 key 通过调试也能拿到

1-3 AES 解密(Python)

首先,利用 Python 实现 AES 的解密逻辑

代码语言:javascript
复制
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_]

然后,通过请求获取加密内容,调用上面的方法进行解密

代码语言:javascript
复制
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 逆向之字体反爬(下)

休闲时光:最近上映的电影与爬虫世界,带您彻底放松!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AirPython 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档