Files
hunyuan3dweb/UNIVERSALITY_ANALYSIS.md
2026-05-24 21:47:44 +08:00

217 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 腾讯混元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. **扩展改进**: 可以构建更通用的前端逆向工具链