217 lines
5.8 KiB
Markdown
217 lines
5.8 KiB
Markdown
# 腾讯混元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<app_name>;
|
||
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. **扩展改进**: 可以构建更通用的前端逆向工具链
|