# 腾讯混元3D 签名算法泛用性分析 ## 核心结论 **该签名算法具有"有限泛用性"** —— 只能在腾讯混元3D产品线内复用,不能直接用于其他腾讯产品或第三方平台。 --- ## 一、算法特征分析 ### 1. 硬编码密钥派生 ```python C = bytes([122, 59, 92, 165, 30, 79, 166, 139, 142, 129, 139, 89, 219, 131, 101, 204]) D = bytes([122, 59, 92, 45, 30, 79, 106, 139, 156, 13, 46, 63, 74, 91, 108, 125]) U = [3, 5, 2, 7, 1, 4, 6, 2, 5, 3, 1, 4, 2, 6, 3, 5] M = [14, 11, 13, 9, 15, 10, 12, 8, 6, 3, 5, 1, 7, 2, 4, 0] ``` **特征**: - 使用 16 字节硬编码种子 `C` - 通过 XOR + 循环左移 + 置换 派生密钥 - 最终密钥: `Hf6d6KFB3D` **泛用性**: ❌ **低** — 这是腾讯混元3D特有的密钥派生方案,其他产品使用不同的密钥。 ### 2. 签名范围 ``` 签名只包含 URL 查询参数,不包含请求体 ``` **特征**: - 仅对 `timestamp` + `nonce` 签名 - 请求体数据不参与签名计算 - 使用 HMAC-SHA256,输出 Hex **泛用性**: ⚠️ **中等** — 这种"轻量级签名"模式在腾讯部分产品中有复用,但具体实现不同。 ### 3. 参数排序规则 ```python # 过滤空值 # 按键名字母顺序排序 # 列表/字典使用 JSON 格式 ``` **泛用性**: ⚠️ **中等** — 这是常见的签名参数处理模式,但不同产品的过滤规则和序列化方式可能不同。 --- ## 二、可复用场景 ### ✅ 可直接复用 | 场景 | 说明 | |------|------| | 腾讯混元3D所有API | 同一套签名算法适用于所有端点 | | 混元3D的不同环境 | dev/pre/prod 使用相同算法(可能密钥不同)| | 同一账号的不同请求 | 签名算法与账号无关 | ### ⚠️ 需要修改后复用 | 场景 | 需要修改的内容 | |------|---------------| | 腾讯其他产品(如混元大模型)| 硬编码常量 C/D/U/M 不同 | | 其他公司的类似产品 | 整套算法可能完全不同 | | 混元3D的移动端API | 可能使用不同的密钥或签名方式 | ### ❌ 无法复用 | 场景 | 原因 | |------|------| | 标准 OAuth/JWT 接口 | 完全不同的认证机制 | | 使用 AK/SK 签名的云服务 | 使用 HMAC-SHA256 但密钥和消息格式不同 | | 无签名的公开 API | 不需要签名 | --- ## 三、方法论的可复用性 虽然具体算法不能泛用,但**逆向方法论**可以复用: ### 1. webpack 模块提取 ```javascript // 适用于所有 webpack 打包的前端应用 const chunks = self.webpackChunk; for (const chunk of chunks) { const modules = chunk[1]; // 搜索包含关键词的模块 } ``` **复用价值**: ⭐⭐⭐⭐⭐ — 所有 webpack 应用都适用 ### 2. 签名定位技巧 ```javascript // Hook Math.random 和 Date.now Math.random = () => { console.trace(); return 0.123; }; Date.now = () => { console.trace(); return 1779599999000; }; ``` **复用价值**: ⭐⭐⭐⭐⭐ — 适用于所有前端签名逆向 ### 3. 请求拦截分析 ```javascript // 拦截 fetch/XHR const origFetch = fetch; fetch = (...args) => { console.log('Fetch:', args); return origFetch(...args); }; ``` **复用价值**: ⭐⭐⭐⭐⭐ — 通用的前端请求分析技术 ### 4. 密钥派生分析 ```python # 从字节数组派生密钥的模式 def derive_key(c, d, u, m): # XOR -> 移位 -> 置换 -> 截断 ... ``` **复用价值**: ⭐⭐⭐ — 密钥派生是常见模式,但具体变换不同 --- ## 四、与其他腾讯产品的对比 | 产品 | 签名方式 | 密钥来源 | 与混元3D的相似度 | |------|----------|----------|-----------------| | 腾讯混元3D | HMAC-SHA256 | 硬编码派生 | 100%(基准)| | 腾讯云 API | HMAC-SHA256 | 用户 SecretKey | 低(密钥不同)| | 微信小程序 | SHA256 | 固定字符串+token | 中(算法类似)| | QQ 音乐 | 未知 | 未知 | 未知 | | 腾讯视频 | 未知 | 未知 | 未知 | --- ## 五、实际应用建议 ### 场景1: 开发混元3D的自动化工具 **适用性**: ⭐⭐⭐⭐⭐ 直接使用本项目的代码,无需修改。 ### 场景2: 逆向其他腾讯产品 **适用性**: ⭐⭐⭐ 可以复用方法论,但需要: 1. 重新提取 webpack 模块 2. 重新定位签名函数 3. 重新分析密钥派生逻辑 ### 场景3: 学习前端逆向技术 **适用性**: ⭐⭐⭐⭐⭐ 本项目是完整的前端逆向案例,涵盖: - JS Bundle 分析 - webpack 模块提取 - 签名算法逆向 - 浏览器自动化测试 - Python 重写验证 ### 场景4: 构建通用签名破解框架 **适用性**: ⭐⭐ 可以构建半自动化工具: ```python class SignatureCracker: def extract_webpack_modules(self, url): ... def locate_sign_function(self, modules, keywords): ... def analyze_key_derivation(self, func_code): ... def verify_signature(self, params, expected_sign): ... ``` 但每个产品仍需要人工分析和调整。 --- ## 六、技术价值评估 | 维度 | 评分 | 说明 | |------|------|------| | 算法复杂度 | ⭐⭐⭐ | 中等(XOR+移位+置换)| | 逆向难度 | ⭐⭐⭐⭐ | 较高(webpack混淆)| | 代码质量 | ⭐⭐⭐⭐⭐ | 清晰可维护 | | 文档完整性 | ⭐⭐⭐⭐⭐ | 详细文档 | | 泛用性 | ⭐⭐ | 仅限混元3D | | 方法论价值 | ⭐⭐⭐⭐⭐ | 可复用的逆向流程 | --- ## 七、总结 ### 算法本身 - **不可泛用**: 硬编码常量和密钥派生方案是混元3D特有的 - **不可迁移**: 不能直接用于其他产品 ### 方法论 - **高度可复用**: 逆向流程、工具、技巧适用于所有前端应用 - **学习价值高**: 完整展示了从 JS 混淆代码到 Python 实现的完整过程 ### 建议 1. **直接使用**: 如果你需要调用混元3D API 2. **参考学习**: 如果你需要逆向其他前端应用 3. **扩展改进**: 可以构建更通用的前端逆向工具链