H5 接口参数 AES 加密看不懂?不用手动解密,抓包里直接看明文并改参重放

0 阅读7分钟

H5 页面发起的 API 请求,参数做了 AES 加密——不是 JSON 里某个字段加密,而是整个请求体变成了一串 hex。你在抓包工具里看到的永远是 {"data":"6be9792e5ed250fc..."},完全不知道实际发出去的是什么。

联调的时候这有多痛苦?后端说"你传的 userId 不对",你连自己传了什么都不知道。想 Mock 一个返回看看页面表现,参数看不懂,规则根本写不了。想改个参数重放一遍,先得找后端要解密脚本,手动跑一遍解码,改完再自己算一遍加密。

试过几种"解法":让后端临时关加密——上线前忘开就是生产事故。自己写 Node 脚本解——接口一多根本维护不过来。人工盯着 hex 猜——你不是 AI,猜不出来。

这个问题的本质是:抓包工具只看到了字节,没有看到字节背后的含义。 你的 DevPeek 装了、代理配了、HTTPS 证书也信任了,但加密这层没打通,等于白抓。

本文不讲加密原理,只讲实操:在 DevPeek 里配好密钥,让抓包列表自动把密文解密成明文显示,改完参数还能自动重新加密发回去。

加密方案长什么样

先看一个典型的 H5 加密请求。客户端 POST 到 /api/query,body 是这个:

{"data":"6be9792e5ed250fc1a19e5bf2e7d0a3d78e7d0eb3d46b8c21a5c...(省略)"}

而实际的参数是:

{"userId":"123","keyword":"看不到我"}

加密过程是 AES-256-GCM,固定 IV,认证标签追加到密文末尾,整体输出 hex 字符串。这是很多内嵌 H5 的常见做法——请求体整体对称加密,后端收到后解密。出于安全考量这么做无可厚非,但联调时你确实是在摸黑干活。

DevPeek 的解决思路是:你告诉它密钥和算法,它自动在抓包时完成加解密,密文还是密文,但旁边多显示一行明文。

这和 Charles 的"手动复制→解码→看结果"完全不同——Charles 只管代理,不知道你的密钥。DevPeek 把参数转换做成了规则引擎,配好之后所有匹配的请求自动解密,不用每次手动操作。

下面我们从头配一遍。整个过程分两步:先建加解密规则(告诉 DevPeek 用什么算法),再建参数转换规则(告诉 DevPeek 对哪个字段应用)。

第一步:配置加解密规则

在请求上右键 → 参数转换

弹出一个「参数转换规则」窗口,先点进 加解密规则 Tab → 添加 → 内置转换 → 选择 AES-GCM

这里是最容易翻车的地方,逐项核对下面这张表:

字段说明
算法aes-gcm
密钥 (Key)342e668900166e5f6731f7a172f52862e3a43da54611519dec5246dadb6e7429SHA-256 派生的 256-bit 密钥
密钥编码Hex ⚠️密钥是 hex 字符串,不是 UTF-8 文本
IV / Noncea1b2c3d4e5f6a7b8c9d0e1f2固定 12 字节 IV
IV / Nonce 编码Hex ⚠️同上
密文输入编码Hex ⚠️Demo 输出的是 hex,不是 base64(DevPeek 默认是 base64)
输出编码UTF-8解密后的明文编码
Auth Tag 长度16GCM 默认 16 字节

注意: 上面打了 ⚠️ 的三项最坑。DevPeek 的内置 AES-GCM 默认 keyEncoding: utf8ivEncoding: utf8inputEncoding: base64,但这里用的是 hex。这三项有一项不对,解密结果就是乱码或失败。遇到解密失败,先检查这三个编码

保存后,加解密规则列表中应该能看到这条 AES-GCM 规则。

第二步:配置参数转换规则

回到参数转换规则窗口,添加一条新规则,告诉 DevPeek 三件事:匹配哪个请求解哪个字段用哪个规则

匹配条件

勾选匹配条件,右侧会实时预览当前请求的特征:

字段
URL 匹配/api/query
请求方法POST
作用域先选「手动」,只对当前请求生效,熟悉了再开自动匹配

转换目标

Body → JSON → data——告诉 DevPeek 要去解密 Body 中 data 字段的值。

引用规则

选择上一步创建的 AES-GCM 加解密规则。此时右侧会立即预览解密结果:

如果一切正确,你会看到 data 字段的密文被解码为 {"userId":"123","keyword":"看不到我"} 这样的明文。看到这个画面就说明配好了。

保存规则。回到请求列表,重新看刚才的请求:

data 字段旁边多了解密后的明文——从这一刻起,不需要再手动复制粘贴去解码了。

进阶:改参数重放

解密只是第一步。联调的完整流程往往是:看到参数 → 发现问题 → 改参数 → 重发验证

参数转换规则中有一个「双向转换」开关:

开启前: 密文可编辑、明文只读显示。你可以手工修改密文再重发,但需要自己构造合法的加密数据——那不如直接关掉加密。

开启后: 密文变为只读,明文变为可编辑。你在明文框里改参数,点「发送」,DevPeek 自动用上一步配置的密钥和 IV 重新加密,再把加密后的请求发出去:

这有什么用?举个例子:你怀疑某个错误码只在 userId 为特定值时触发。开启双向转换后,直接在明文里改 userId,DevPeek 帮你加密拼好 body 发出去,一秒验证一次,不需要写脚本轮询。

更多场景

上面是一个固定 IV、Tag 追加的 AES-GCM 例子。实际项目中的加密方案千差万别,常见变种包括:

  • 动态 IV:IV 不在配置里写死,而是随着请求一起传递(比如放在请求头的某个字段里)
  • 密钥需要远程获取:系统启动时从密钥管理服务拉取,或者在每次请求前通过另一个接口获取
  • 加密算法不同:AES-CBC、AES-ECB、RSA、自定义算法

面对这些场景,内置转换不够用怎么办?DevPeek 还有一个脚本转换功能——在沙箱中自定义 JS 解密逻辑,沙箱内置了 util.cryptoutil.encodeaxiosURL 等 API。你可以写一段脚本从请求头里提取动态 IV、或者远程调用密钥服务拿到密钥后再解密。具体见脚本转换文档

原理几句话

参数转换的工作方式是一个匹配 → 提取 → 解密 → 展示的管道:

请求到达 DevPeek
    │
    ▼ 匹配规则 (URL + Method)
    │
    ▼ 提取目标字段值 (body:json:data)
    │
    ▼ 引用加解密规则执行 AES-GCM
    │
    ▼ 结果挂在 paramTransformDerived 字段
    │   原始请求 body 不变,旁边附加解密后明文
    │
    ▼ 展示:请求详情、双向编辑、重放

注意 DevPeek 不会修改原始请求——密文还是那个密文,解密后的明文单独存放在 paramTransformDerived 字段中。解密失败也不影响原始数据。

内置转换除了 AES-GCM 还支持 AES-CBC、AES-ECB、DES-CBC、3DES-CBC、RSA、Base64 等常见算法。


总的来说,接口参数加密在 H5 开发中越来越常见,但联调不应该因此变慢。一次性的规则配置能节省大量重复的解密操作。如果你也在联调时一遍遍手工解码请求参数,可以试试这个流程。

相关文档


若你也在联调里一遍遍手工处理加密请求体,欢迎下载 DevPeek 试用按本文步骤配好第一条解密规则,或到 GitHub Discussions 聊聊你的加密方案。