如何在Python爬虫中模拟App的Header签名算法_使用PyCryptodome库重现加密逻辑

浅静君_3207

浅静君_3207

2026-05-28

757人浏览

原创

app端header签名失效是因为其为基于时间戳、随机数、请求体、密钥等动态参数实时计算的hmac-sha256或aes-cbc结果,并非固定字符串;硬编码抓包值必然失败,需通过frida hook还原真实key/data/iv输入并用pycryptodome精准复现拼接与加解密逻辑。

如何在python爬虫中模拟app的header签名算法_使用pycryptodome库重现加密逻辑

为什么直接复制App的Header签名会失效

App端签名通常不是固定字符串,而是基于时间戳、随机数、请求体、密钥等动态参数实时计算的HMAC-SHA256或AES-CBC结果。抓包看到的X-Sign或Signature字段每次都不一样,硬编码必然失败。

关键点在于:签名逻辑往往藏在so库或混淆后的Java/Kotlin代码里,但多数情况下,核心加密流程仍依赖标准算法——PyCryptodome能覆盖绝大多数场景,前提是还原出正确的输入拼接方式和密钥处理逻辑。

  • 常见错误现象:Signature verification failed 或 401 Unauthorized,即使时间戳、nonce、body都对得上
  • 根本原因:密钥被二次处理(如base64解码后再取前16字节)、原始数据未按约定排序/拼接/编码(比如要求UTF-8 bytes但用了str)、缺少预置IV或padding方式不匹配
  • 调试建议:用Frida Hook住签名函数,打印出实际传入的key、data、iv三元组,这是最可靠的输入依据

用PyCryptodome实现HMAC-SHA256签名(最常见类型)

多数App用HMAC-SHA256生成签名,密钥通常是硬编码在APK里的字符串,但可能经过base64.b64decode()或bytes.fromhex()转换。

注意:HMAC不要求IV,但必须严格对齐密钥长度(SHA256推荐32字节密钥)。若原始密钥不足32字节,有些App会用PKCS#7 padding补足,更多情况是直接截断或重复填充——需逆向确认。

from hashlib import sha256
from hmac import HMAC
<h1>假设逆向得到原始密钥为 base64 字符串,且需解码</h1><p>raw_key = "dGhpcyBpcyBhIHNlY3JldA=="
key = base64.b64decode(raw_key)</p><h1>拼接规则示例:method + \n + path + \n + timestamp + \n + nonce + \n + body_md5</h1><p>message = f"POST\n/api/v1/user\n1717023456\nabc123\n{md5(body.encode()).hexdigest()}".encode()</p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8910" title="361SCAN security check your skill python scripts"><img
														src="https://img.php.cn/upload/skill/000/000/081/179231049778675.jpg" alt="361SCAN security check your skill python scripts" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill8910" title="361SCAN security check your skill python scripts" class="overflowclass">361SCAN security check your skill python scripts</a>
													<p class="overflowclass">扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill8910" title="361SCAN security check your skill python scripts" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div><p>signature = HMAC(key, message, sha256).hexdigest()
headers["X-Sign"] = signature
</p>
  • 务必检查App是否对body做了MD5(或SHA1)哈希后再参与拼接;有些只取body非空时的原始bytes
  • 时间戳单位要一致(秒 or 毫秒),且服务端常有5分钟容错窗口,本地时间偏差过大会直接拒签
  • Python 3.9+ 的HMAC默认接受bytes,传str会报TypeError: key: expected bytes or bytearray, but got 'str'

AES-CBC签名(带IV的加密型签名)

少数App把拼接后的字符串用AES-CBC加密再hex,作为签名。此时必须还原出IV——它可能是固定值(如b"0102030405060708"),也可能是从请求头或响应中动态提取的字段(如X-Nonce前8字节)。

PyCryptodome要求明文长度是16字节整数倍,PKCS#7是最常用padding方式。别用pad(data, 16)这种模糊写法,必须显式调用PKCS7模块或手写补位逻辑。

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
<p>key = b"your-32-byte-key-here-123456789012"
iv = b"0102030405060708"  # 必须16字节
data = "timestamp=1717023456&nonce=abc123&body={}".format(body).encode()</p><p>cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(data, AES.block_size))
signature = encrypted.hex()
headers["X-Sign"] = signature
</p>
  • 如果服务端返回Invalid IV或解密乱码,优先怀疑IV来源不对;可用Wireshark对比真实App请求中的X-IV或类似字段
  • 某些App会把AES输出再做一次base64或反转字节序(encrypted[::-1]),这类变形必须靠Hook日志确认
  • PyCryptodome安装命令是pip install pycryptodome,不是pycrypto(已废弃且不兼容)

签名验证失败时的快速定位路径

当签名始终不通过,不要反复改密钥长度或算法——先确认输入是否完全一致。真实App签名函数的输入,永远比你从代码里猜出来的更“脏”。

  • 用Frida Hook javax.crypto.Mac.getInstance("HmacSHA256") 或 javax.crypto.Cipher.getInstance("AES/CBC/PKCS7Padding"),打印doFinal()前的input和key
  • 对比Python与App端的message十六进制dump(message.hex()),一个换行符、一个空格、一个URL编码差异都会导致签名不同
  • 服务端有时会校验User-Agent或X-App-Version,这些虽不参与签名,但缺失会导致整个请求被拦截,误判为签名错误

逆向签名逻辑最难的从来不是算法本身,而是搞清那几行不起眼的字符串拼接和编码转换——它们藏在层层嵌套的工具类里,且没有日志输出。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4524

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26637

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3227

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3247

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2523

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习