新版本客户端 xeapi 支持#163
Conversation
Greptile Summary本 PR 为网易云音乐 3.1.35 引入的 xeapi 加密请求方式提供主进程侧支持,新增
Confidence Score: 4/5整体实现完整,但 aegisEncrypt 在加密失败时静默返回明文,渲染进程在状态降级通知到达前会用明文发出 xeapi 请求导致该次请求被服务端拒绝 aegisEncrypt handler 捕获加密异常后返回原始明文,与加密成功的返回形状相同,渲染进程无法同步区分。状态降级通知通过独立 IPC 消息异步到达,存在时间窗口使渲染进程以"加密成功"为假设提交了实际未加密的请求体,该请求必然被服务端拒绝。 src/main/calls/network.ts 中 aegisEncrypt handler 的错误处理路径需要关注
|
| Filename | Overview |
|---|---|
| src/main/xeapi.ts | 新增 XeapiAegis 核心加密类,实现 X25519 ECDH + AES-GCM 动态密钥封装、AES-ECB 业务数据加密、公钥缓存/更新、多 nonce Set 防竞态;先前反馈的竞态与 code==0 问题均已修复 |
| src/main/calls/network.ts | 新增 4 个 IPC call handler(initAegis、aegisEncrypt、setSession、updateAegisPublicKey);aegisEncrypt 在加密失败时静默返回原始明文,渲染进程无法同步感知失败 |
| src/main/folders.ts | 新增 aegisPublicKey 路径常量,指向 userData/Aegis/pubkey,变更简单、无风险 |
Sequence Diagram
sequenceDiagram
participant R as 渲染进程
participant M as 主进程 (network.ts)
participant A as XeapiAegis
participant S as 网易云服务端
R->>M: network.initAegis(config)
M->>A: aegis.init(config, callbacks)
A->>A: loadCachedPublicKey()
A->>M: callbacks.onRequestPublicKey(request)
M-->>R: channel.call network.onRequestAegisPublicKey
R->>S: GET /xeapi/pubkey (带 signature/nonce)
S-->>R: "{ code:200, data:{ encryptedData, signature } }"
R->>M: network.updateAegisPublicKey(response)
M->>A: updatePublicKeyResponse(responseText)
A->>A: 验证 nonce + 解密公钥 + 保存缓存
A->>M: callbacks.onEncryptStateChange(Normal)
M-->>R: channel.call network.onEncryptStateChange
R->>M: "network.aegisEncrypt({ body })"
M->>A: aegis.encrypt(body)
A->>A: encryptBusinessData + encryptDynamicKey (X25519+AES-GCM)
A-->>M: "B=...&S=...&R=..."
M-->>R: "{ encryptedBody }"
R->>S: POST xeapi 请求 (encryptedBody)
S-->>R: 加密响应
Reviews (2): Last reviewed commit: "fix: race condition when init xeapi pubk..." | Re-trigger Greptile
YUCLing
left a comment
There was a problem hiding this comment.
十分感谢,不过该 PR 只会在更新至对应引入版本时才会合并
btw,有一点好奇,PC 端的 Aegis 是单独的库吗?如果是的话,和 Android 的 libAegisSDK.so 是同一个库吗(大致上)
是单独的库,名称为AegisSDK.dll,目测基本差不多,加密算法基本一致,但初始化参数与 Android 不完全一致,因此目前的写法来源于 Windows native |
|
基本把前面的问题做了些修改,在更新资源包之前我先保持草稿吧,到时候我再转 |
新版客户端在 3.1.35 引入了 xeapi 这种新的 API 加密形式,目前正在 AB test,我在今天(2026-06-12)收到的更新
最新版本的 version.json
{ "version": "3.1.35", "build": "205293", "commit": "0a56446", "downloadUrl": "https://d8.music.126.net/dmusic2/NeteaseCloudMusic_Music_official_3.1.35.205293_64.exe" }本 pr 尝试完成对新的 xeapi 请求方式的支持,防止新版用户在进入 AB test 组后请求失败。
目前在本地测试正常,常见接口均可正常 xeapi 请求
如何强行进行测试
我是尝试在 src/preload.ts 末尾处做 hook 来模拟进组之后的状态
然后可以在 request 处做 hook 来看到请求响应,具体内容解密或许需要 hook 前端,本地测试请求返回正常,客户端在上述 hook 下业务展示正常,应该是问题不大