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) | 342e668900166e5f6731f7a172f52862e3a43da54611519dec5246dadb6e7429 | SHA-256 派生的 256-bit 密钥 |
| 密钥编码 | Hex ⚠️ | 密钥是 hex 字符串,不是 UTF-8 文本 |
| IV / Nonce | a1b2c3d4e5f6a7b8c9d0e1f2 | 固定 12 字节 IV |
| IV / Nonce 编码 | Hex ⚠️ | 同上 |
| 密文输入编码 | Hex ⚠️ | Demo 输出的是 hex,不是 base64(DevPeek 默认是 base64) |
| 输出编码 | UTF-8 | 解密后的明文编码 |
| Auth Tag 长度 | 16 | GCM 默认 16 字节 |
注意: 上面打了 ⚠️ 的三项最坑。DevPeek 的内置 AES-GCM 默认
keyEncoding: utf8、ivEncoding: utf8、inputEncoding: 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.crypto、util.encode、axios、URL 等 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 聊聊你的加密方案。