5.8 KiB
5.8 KiB
腾讯混元3D 签名算法泛用性分析
核心结论
该签名算法具有"有限泛用性" —— 只能在腾讯混元3D产品线内复用,不能直接用于其他腾讯产品或第三方平台。
一、算法特征分析
1. 硬编码密钥派生
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. 参数排序规则
# 过滤空值
# 按键名字母顺序排序
# 列表/字典使用 JSON 格式
泛用性: ⚠️ 中等 — 这是常见的签名参数处理模式,但不同产品的过滤规则和序列化方式可能不同。
二、可复用场景
✅ 可直接复用
| 场景 | 说明 |
|---|---|
| 腾讯混元3D所有API | 同一套签名算法适用于所有端点 |
| 混元3D的不同环境 | dev/pre/prod 使用相同算法(可能密钥不同) |
| 同一账号的不同请求 | 签名算法与账号无关 |
⚠️ 需要修改后复用
| 场景 | 需要修改的内容 |
|---|---|
| 腾讯其他产品(如混元大模型) | 硬编码常量 C/D/U/M 不同 |
| 其他公司的类似产品 | 整套算法可能完全不同 |
| 混元3D的移动端API | 可能使用不同的密钥或签名方式 |
❌ 无法复用
| 场景 | 原因 |
|---|---|
| 标准 OAuth/JWT 接口 | 完全不同的认证机制 |
| 使用 AK/SK 签名的云服务 | 使用 HMAC-SHA256 但密钥和消息格式不同 |
| 无签名的公开 API | 不需要签名 |
三、方法论的可复用性
虽然具体算法不能泛用,但逆向方法论可以复用:
1. webpack 模块提取
// 适用于所有 webpack 打包的前端应用
const chunks = self.webpackChunk<app_name>;
for (const chunk of chunks) {
const modules = chunk[1];
// 搜索包含关键词的模块
}
复用价值: ⭐⭐⭐⭐⭐ — 所有 webpack 应用都适用
2. 签名定位技巧
// Hook Math.random 和 Date.now
Math.random = () => { console.trace(); return 0.123; };
Date.now = () => { console.trace(); return 1779599999000; };
复用价值: ⭐⭐⭐⭐⭐ — 适用于所有前端签名逆向
3. 请求拦截分析
// 拦截 fetch/XHR
const origFetch = fetch;
fetch = (...args) => {
console.log('Fetch:', args);
return origFetch(...args);
};
复用价值: ⭐⭐⭐⭐⭐ — 通用的前端请求分析技术
4. 密钥派生分析
# 从字节数组派生密钥的模式
def derive_key(c, d, u, m):
# XOR -> 移位 -> 置换 -> 截断
...
复用价值: ⭐⭐⭐ — 密钥派生是常见模式,但具体变换不同
四、与其他腾讯产品的对比
| 产品 | 签名方式 | 密钥来源 | 与混元3D的相似度 |
|---|---|---|---|
| 腾讯混元3D | HMAC-SHA256 | 硬编码派生 | 100%(基准) |
| 腾讯云 API | HMAC-SHA256 | 用户 SecretKey | 低(密钥不同) |
| 微信小程序 | SHA256 | 固定字符串+token | 中(算法类似) |
| QQ 音乐 | 未知 | 未知 | 未知 |
| 腾讯视频 | 未知 | 未知 | 未知 |
五、实际应用建议
场景1: 开发混元3D的自动化工具
适用性: ⭐⭐⭐⭐⭐
直接使用本项目的代码,无需修改。
场景2: 逆向其他腾讯产品
适用性: ⭐⭐⭐
可以复用方法论,但需要:
- 重新提取 webpack 模块
- 重新定位签名函数
- 重新分析密钥派生逻辑
场景3: 学习前端逆向技术
适用性: ⭐⭐⭐⭐⭐
本项目是完整的前端逆向案例,涵盖:
- JS Bundle 分析
- webpack 模块提取
- 签名算法逆向
- 浏览器自动化测试
- Python 重写验证
场景4: 构建通用签名破解框架
适用性: ⭐⭐
可以构建半自动化工具:
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 实现的完整过程
建议
- 直接使用: 如果你需要调用混元3D API
- 参考学习: 如果你需要逆向其他前端应用
- 扩展改进: 可以构建更通用的前端逆向工具链