python爬虫SHA案例:某直播大数据分析平台

声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关

一、找出需要加密的参数
  1. js运行 atob(‘aHR0cDovL3d3dy5oaDEwMjQuY29tLyMvc2VhcmNoL3NlYXJjaA==’) 拿到网址,F12打开调试工具,点击搜索,找到 api/dy 请求,鼠标右击请求找到Copy>Copy as cUrl(cmd)
  2. 打开网站:https://spidertools.cn/#/curl2Request,把拷贝好的curl转成python代码
    在这里插入图片描述
  3. 新建hrdj.py文件,把代码复制到该文件内,复制请求中的参数赋值给data,把请求中的data参数换成json,把reponse.text换成reponse.json(),运行该文件会发现请求成功,并且成功打印出数据
    在这里插入图片描述在这里插入图片描述
  4. 然后把代码中的header全部注释,再运行文件,会发现数据依然可以请求成功,再把data中的sign注释会发现数据请求失败,说明cookie中不存在加密参数,params中的code是加密参数,token看起来是加密参数,不过是登陆成功后后台返回的,不用管
    在这里插入图片描述
二、定位参数加密位置
  1. 首先尝试关键字code搜索,会发现很难定位到
    在这里插入图片描述
  2. 切换到sources,添加XHR拦截 api/dy
    在这里插入图片描述
  3. 点击搜索发送方请求,一直点击跳到下一个函数,遇到拦截器,会发现请求拦截器中并没有相关的加密逻辑,继续点击跳到下一个函数,遇到 a 是返回结果的时候,分析代码发现,会发现 Object(D[“g”])(a).then 方法,恰好 a 是 then 里面函数的参数,可以初步判断 Object(D[“g”]) 是调用请求的函数,在 then 里面打上断点
    在这里插入图片描述在这里插入图片描述
  4. 结束断点调试,点击搜索发送方请求,点击跳过断点调试,找到刚才打断点的地方,鼠标悬浮到 D[“g”] 上,点击蓝色的地方找到该方法,会发现有两个 sign 赋值的地方,可以确定 sign 是在这两个地方中其中一个生成的,在这两个地方都打上断点 ,至此 sign 加密位置以确定
    在这里插入图片描述在这里插入图片描述
三、分析 sign 值加密代码
  1. 结束断点调试,点击搜索发送方请求,在控制台输出 E(n, e) ,结束断点调试,最新查看请求中的 sign 和打印出的 E(n, e) 值是一样的,说明 sign 是由E(n, e) 生成
    在这里插入图片描述
  2. 点击搜索发送方请求,分析代码得知 E(n, e) 内部是由 k(“param=” + JSON.stringify(n) + “&timestamp=” + e + “&tenant=1&salt=” + C) 实现,而 k = t(“6c27”).sha256 说明该算法是 SHA256 算法生成
    在这里插入图片描述
四、生成加密参数
  1. 新建 hrdj.js 用于放 扣下的 js 代码
  2. 把 E 函数拷贝出来,放到 hrdj.js 文件,并把 k 替换成 SHA256 算法
    在这里插入图片描述
  3. 分析加密数据,把 n 输出控制台会发现,n 是请求中的 param 参数,分析代码 可以看出 e = (new Date).getTime(),而 C 是 z 函数,把 z 函数拷贝出来,放到 hrdj.js 文件,把 C 换成 e函数 ,把 E 参数的 e 换成 e = (new Date).getTime(),有命名冲突的需要换命名,其实 C 是固定的字符串直接打印出来赋值就行,这里为了走完流程把 C 生成的代码也扣一下
    在这里插入图片描述在这里插入图片描述
  4. 分析z函数,需要注意的有 s[“a”]、A[“a”]、h[“a”]、p[“a”]、f[“a”]、m[“b”],把它们在控制台打印出来发现都是函数,点击控制台上的打印信息,把函数拷贝到 hrdj.js 文件,分别替换 s[“a”]、A[“a”]、h[“a”]、p[“a”]、f[“a”]、m[“b”],在拷贝的过程中会发现这些函数内部实现的变量都是固定值,只有 m[“b”] 函数中的 i 变量是由 t 函数生成,在生成 i 的地方打断点
    在这里插入图片描述在这里插入图片描述
  5. 刷新页面,在控制台输出 i 会发现 i = 66,把 hrdj.js 里 d1 的 i 替换成 66
    在这里插入图片描述在这里插入图片描述
  6. 验证签名,api/dy 请求上的 param 参数本来就是字符串,所以把 JSON.stringify(n) 换成 n 就行,打印出加密数据 和 加密结果,复制加密数据,打开 https://spidertools.cn/#/crypto,找到加解密中
    在这里插入图片描述在这里插入图片描述
五、验证结果
  1. 修改 hrdj.py 文件,重新运行,数据获取成功
    在这里插入图片描述在这里插入图片描述
<think>好的,我现在需要解决用户的问题:如何在Python爬虫中对请求参数进行加密。用户提到了之前的回答和相关引用,我需要结合这些信息来给出详细的步骤和方法。 首先,回顾用户之前的对话,用户已经了解了如何添加GET和POST请求的参数,现在关注的是参数加密。根据提供的引用内容,加密通常涉及到逆向分析JavaScript代码,然后用Python模拟加密逻辑。引用1提到使用hashlib来模拟MD5加密,引用2和3讨论了逆向JS和用Python重写加密函数,引用4提到了时间戳、参数排序和Base64加密的例子。 用户的需求可能包括常见的加密方法,如哈希、Base64、AES等,以及如何处理动态参数如时间戳和随机数。此外,用户可能还想了解如何逆向JS找到加密逻辑,这是实际爬虫中常遇到的难点。 接下来,我需要组织回答的结构。首先概述加密的必要性,然后分步骤介绍常见加密方法,包括哈希、Base64、对称加密(如AES)、非对称加密(如RSA)。然后详细说明如何逆向分析JavaScript,包括使用浏览器开发者工具定位加密函数,调试并理解逻辑,最后用Python实现。可能需要结合引用中的例子,如MD5模拟、Base64处理,以及动态参数生成。 还要注意用户可能遇到的困难,比如复杂的JS混淆,这时可能需要工具如PyExecJS来执行JS代码,或者使用自动化工具如Selenium。同时,提醒用户注意法律和道德规范,避免侵犯隐私或触犯法律。 最后,生成相关问题,帮助用户进一步学习,比如处理JS混淆、解决动态密钥、提升逆向效率等。 需要确保回答清晰,步骤明确,代码示例正确,并正确引用之前的资料,比如引用1的MD5示例,引用4的Base64和时间戳处理。同时,保持语言口语化,避免使用专业术语过多,但必要时解释清楚。</think>在Python爬虫中处理请求参数加密,需要通过逆向分析目标网站的加密逻辑,并采用Python代码模拟实现。以下是具体实现方法和步骤: --- ### 一、常见加密类型及Python实现 #### 1. 哈希算法(如MD5/SHA) 用于参数签名验证,通过不可逆加密生成唯一标识 ```python import hashlib def md5_encrypt(text): md5 = hashlib.md5() md5.update(text.encode('utf-8')) return md5.hexdigest() # 示例:加密时间戳 timestamp = str(int(time.time()*1000)) sign = md5_encrypt(f"key={timestamp}&salt=abc123") ``` [^1] #### 2. Base64编码 常用于简单数据混淆处理 ```python import base64 # 参数编码 param = "page=2&size=20".encode('utf-8') encoded = base64.b64encode(param).decode() # 解码验证 decoded = base64.b64decode(encoded).decode() ``` [^4] #### 3. 对称加密(AES/DES) 需要获取密钥进行加解密 ```python from Crypto.Cipher import AES import binascii def aes_encrypt(data, key, iv): cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode()) padded = data + (16 - len(data) % 16) * chr(16 - len(data) % 16) encrypted = cipher.encrypt(padded.encode()) return binascii.b2a_hex(encrypted).decode() # 示例使用 encrypted = aes_encrypt('page=1', '1234567890123456', '1234567890123456') ``` #### 4. 非对称加密(RSA) 处理需要公钥加密的场景 ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 def rsa_encrypt(data, public_key): rsa_key = RSA.importKey(public_key) cipher = PKCS1_v1_5.new(rsa_key) return base64.b64encode(cipher.encrypt(data.encode())).decode() ``` --- ### 二、逆向分析JS加密流程 #### 步骤1:定位加密入口 1. 使用Chrome开发者工具(F12) 2. 在Network面板捕获加密请求 3. 通过XHR断点或搜索加密参数定位JS文件 #### 步骤2:调试加密逻辑 ```javascript // 典型加密函数结构 function encryptParams(params) { let timestamp = Date.now(); let sorted = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&'); return md5(sorted + salt_key); } ``` #### 步骤3:Python复现逻辑 ```python import time def generate_params(page): params = { "page": page, "ts": int(time.time()*1000), "nonce": random.randint(1000,9999) } sorted_str = '&'.join([f"{k}={v}" for k,v in sorted(params.items())]) params['sign'] = hashlib.sha256(f"{sorted_str}appSecret").hexdigest() return params ``` [^4] --- ### 三、实战案例解析 以某电商网站搜索接口为例: 1. 原始请求参数: ```python {"keyword": "手机", "page": 1} ``` 2. 加密后参数: ```python { "payload": "eyJraWQiOiIxMjM0NSIsImVuY3J5cHRlZERhdGEiOiJNek...", "x-sign": "a1b2c3d4e5f6" } ``` 3. Python复现流程: ```python def encrypt_payload(params): # 步骤1:添加时间戳 params['timestamp'] = int(time.time()*1000) # 步骤2:参数排序并序列化 sorted_params = json.dumps(params, sort_keys=True) # 步骤3:AES加密 encrypted = aes_encrypt(sorted_params, AES_KEY, AES_IV) # 步骤4:生成签名 sign = md5_encrypt(encrypted + SIGN_SALT) return {"payload": encrypted, "x-sign": sign} ``` --- ### 四、特殊场景处理 1. **动态密钥**:通过首次请求获取加密密钥 2. **环境检测**:使用`execjs`库直接执行JS代码 ```python import execjs with open('encrypt.js') as f: js_code = f.read() ctx = execjs.compile(js_code) encrypted = ctx.call('encrypt', 'raw_data') ``` 3. **反调试绕过**:使用无头浏览器获取加密结果 ```python from selenium.webdriver import ChromeOptions options = ChromeOptions() options.add_argument('--headless') driver = webdriver.Chrome(options=options) driver.get(url) encrypted = driver.execute_script('return window.encrypt(param);') ``` --- ### 五、注意事项 1. 优先使用网站的公开API接口 2. 遵守robots.txt协议 3. 控制请求频率避免被封禁 4. 加密逻辑变更时需要及时更新代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

局外人LZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值