社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

AirPython • 1 年前 • 232 次点击  

大家好,我是安果!

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

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

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

目标对象:

aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5

具体操作步骤如下:

1-1  安装依赖

# 安装依赖
pip3 install pycryptodome

1-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 逆向之字体反爬(下)

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


END


好文和朋友一起看~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/158356
 
232 次点击