first commit

This commit is contained in:
admin committed 2026-11-05 14:35:04 +08:00
commit 669f49b1d6
342 files changed
+320811

No files matched your search

+11
View File
@@ -0,0 +1,11 @@
比如 XG_方控、应用外发.zpo
.png)
1.打开ZcanPro --> 高级功能 --> 实时曲线分析
.png)
.png)
Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

@@ -0,0 +1,122 @@
# 车载系统安全升级原理与流程
## 一、核心原理
### 算法组合
```
RSA2048 + SHA256 = SHA256withRSA
SHA-256:计算文件哈希值(32字节指纹)
RSA2048:公钥验证签名(2048位密钥强度)
```
### 安全保证
```
✅ 防伪造:私钥只有官方有,无法伪造签名
✅ 防篡改:文件任何修改 → 哈希值变化 → 签名失效
✅ 可追溯:签名验证成功 = 官方发布
```
---
## 二、验证流程
### 三个核心步骤
```
第一步:计算文件哈希值
固件文件 → SHA-256算法 → 32字节哈希值
第二步:加载公钥
PEM格式公钥 → Base64解码 → RSA公钥对象
第三步:验证签名
哈希值 + 签名 + 公钥 → SHA256withRSA验证 → true/false
```
### 验证逻辑
```
验证成功:
公钥解密签名 → 得到原哈希值
对比计算哈希值 == 原哈希值 → ✅ 验证通过
验证失败:
对比哈希值不相等 → ❌ 文件被篡改或签名伪造
```
---
## 三、升级流程
### 整体流程图
```
用户插入U盘(包含升级包)
↓
系统检测升级包
↓
解压ZIP包
↓
计算固件哈希值(SHA-256)
↓
读取签名文件(ValidationFile.ini)
↓
加载公钥验证签名(RSA2048)
↓
├─ ✅ 验证通过
│ ↓
│ 执行升级
│ ↓
│ 升级完成
│ ↓
│ 自动删除临时文件
│
└─ ❌ 验证失败
↓
中止升级
↓
自动删除临时文件
↓
提示验证失败
```
---
## 四、升级包格式
### 文件结构
```
MCU升级包:
update_mcu.zip
├── cortex-gdm4.bin (MCU固件)
└── ValidationFile.ini (签名文件)
SOC升级包:
update.zip (U盘中的文件名)
├── update.zip (内层OTA包)
└── ValidationFile.ini (签名文件)
ValidationFile.ini格式:
sign=<256字节十六进制签名>
```
### 命名对照
| 类型 | U盘文件名 | 解压后固件 | 签名文件 |
|------|-----------|------------|----------|
| MCU | `update_mcu.zip` | `cortex-gdm4.bin` | `ValidationFile.ini` |
| SOC | `update.zip` | `update.zip`(内层) | `ValidationFile.ini` |
---
## 五、一句话总结
**原理**:用私钥给文件哈希值签名,车端用公钥验证签名,通过哈希对比判断文件是否官方发布且未被篡改。
**流程**:解压 → 计算哈希 → 读取签名 → 加载公钥 → 验证签名 → 通过则升级,失败则中止。
**安全**:RSA2048无法破解,SHA-256无法碰撞,私钥只有官方有,数学保证100%安全。
@@ -0,0 +1,122 @@
# 车载系统安全升级原理与流程
## 一、核心原理
### 算法组合
```
RSA2048 + SHA256 = SHA256withRSA
SHA-256:计算文件哈希值(32字节指纹)
RSA2048:公钥验证签名(2048位密钥强度)
```
### 安全保证
```
✅ 防伪造:私钥只有官方有,无法伪造签名
✅ 防篡改:文件任何修改 → 哈希值变化 → 签名失效
✅ 可追溯:签名验证成功 = 官方发布
```
---
## 二、验证流程
### 三个核心步骤
```
第一步:计算文件哈希值
固件文件 → SHA-256算法 → 32字节哈希值
第二步:加载公钥
PEM格式公钥 → Base64解码 → RSA公钥对象
第三步:验证签名
哈希值 + 签名 + 公钥 → SHA256withRSA验证 → true/false
```
### 验证逻辑
```
验证成功:
公钥解密签名 → 得到原哈希值
对比计算哈希值 == 原哈希值 → ✅ 验证通过
验证失败:
对比哈希值不相等 → ❌ 文件被篡改或签名伪造
```
---
## 三、升级流程
### 整体流程图
```
用户插入U盘(包含升级包)
↓
系统检测升级包
↓
解压ZIP包
↓
计算固件哈希值(SHA-256)
↓
读取签名文件(ValidationFile.ini)
↓
加载公钥验证签名(RSA2048)
↓
├─ ✅ 验证通过
│ ↓
│ 执行升级
│ ↓
│ 升级完成
│ ↓
│ 自动删除临时文件
│
└─ ❌ 验证失败
↓
中止升级
↓
自动删除临时文件
↓
提示验证失败
```
---
## 四、升级包格式
### 文件结构
```
MCU升级包:
update_mcu.zip
├── cortex-gdm4.bin (MCU固件)
└── ValidationFile.ini (签名文件)
SOC升级包:
update.zip (U盘中的文件名)
├── update.zip (内层OTA包)
└── ValidationFile.ini (签名文件)
ValidationFile.ini格式:
sign=<256字节十六进制签名>
```
### 命名对照
| 类型 | U盘文件名 | 解压后固件 | 签名文件 |
|------|-----------|------------|----------|
| MCU | `update_mcu.zip` | `cortex-gdm4.bin` | `ValidationFile.ini` |
| SOC | `update.zip` | `update.zip`(内层) | `ValidationFile.ini` |
---
## 五、一句话总结
**原理**:用私钥给文件哈希值签名,车端用公钥验证签名,通过哈希对比判断文件是否官方发布且未被篡改。
**流程**:解压 → 计算哈希 → 读取签名 → 加载公钥 → 验证签名 → 通过则升级,失败则中止。
**安全**:RSA2048无法破解,SHA-256无法碰撞,私钥只有官方有,数学保证100%安全。
@@ -0,0 +1,123 @@
# 车载系统安全升级原理与流程
## 一、核心原理
### 算法组合
```
RSA2048 + SHA256 = SHA256withRSA
SHA-256:计算文件哈希值(32字节指纹)
RSA2048:公钥验证签名(2048位密钥强度)
```
### 安全保证
```
✅ 防伪造:私钥只有官方有,无法伪造签名
✅ 防篡改:文件任何修改 → 哈希值变化 → 签名失效
✅ 可追溯:签名验证成功 = 官方发布
✅ 验证准确:数学原理保证验证结果100%准确(无误判)
```
---
## 二、验证流程
### 三个核心步骤
```
第一步:计算文件哈希值
固件文件 → SHA-256算法 → 32字节哈希值
第二步:加载公钥
PEM格式公钥 → Base64解码 → RSA公钥对象
第三步:验证签名
哈希值 + 签名 + 公钥 → SHA256withRSA验证 → true/false
```
### 验证逻辑
```
验证成功:
公钥解密签名 → 得到原哈希值
对比计算哈希值 == 原哈希值 → ✅ 验证通过
验证失败:
对比哈希值不相等 → ❌ 文件被篡改或签名伪造
```
---
## 三、升级流程
### 整体流程图
```
用户插入U盘(包含升级包)
↓
系统检测升级包
↓
解压ZIP包
↓
计算固件哈希值(SHA-256)
↓
读取签名文件(ValidationFile.ini)
↓
加载公钥验证签名(RSA2048)
↓
├─ ✅ 验证通过
│ ↓
│ 执行升级
│ ↓
│ 升级完成
│ ↓
│ 自动删除临时文件
│
└─ ❌ 验证失败
↓
中止升级
↓
自动删除临时文件
↓
提示验证失败
```
---
## 四、升级包格式
### 文件结构
```
MCU升级包:
update_mcu.zip
├── cortex-gdm4.bin (MCU固件)
└── ValidationFile.ini (签名文件)
SOC升级包:
update.zip (U盘中的文件名)
├── update.zip (内层OTA包)
└── ValidationFile.ini (签名文件)
ValidationFile.ini格式:
sign=<256字节十六进制签名>
```
### 命名对照
| 类型 | U盘文件名 | 解压后固件 | 签名文件 |
| --- | ---------------- | ----------------- | -------------------- |
| MCU | `update_mcu.zip` | `cortex-gdm4.bin` | `ValidationFile.ini` |
| SOC | `update.zip` | `update.zip`(内层) | `ValidationFile.ini` |
---
## 五、一句话总结
**原理**:用私钥给文件哈希值签名,车端用公钥验证签名,通过哈希对比判断文件是否官方发布且未被篡改。
**流程**:解压 → 计算哈希 → 读取签名 → 加载公钥 → 验证签名 → 通过则升级,失败则中止。
**安全**:RSA2048在当前技术水平下难以破解,SHA-256抗碰撞性极强,私钥只有官方持有,数学保证验证结果100%准确(无误判)。
@@ -0,0 +1,341 @@
# 文档与代码核对报告
## 一、发现的关键差异
### ❌ **差异1:SOC升级包名称不一致**
```
文档描述:
update_soc.zip
实际代码:
StorageVolumeEventListener.java:29
public static final String SOC_UPDATE_FILE = "update.zip";
结论:代码检测的是 "update.zip",不是 "update_soc.zip"
```
---
## 二、完整对照表
### 2.1 升级包名称对照
| 项目 | 文档描述 | 实际代码 | 是否一致 |
|------|----------|----------|----------|
| **MCU升级包** | `update_mcu.zip` | `update_mcu.zip` | ✅ 一致 |
| **SOC升级包** | `update_soc.zip` | `update.zip` | ❌ **不一致** |
| **MCU固件文件** | `cortex-gdm4.bin` | `cortex-gdm4.bin` | ✅ 一致 |
| **SOC升级文件** | `update.zip` | `update.zip` | ✅ 一致 |
| **签名文件** | `ValidationFile.ini` | `ValidationFile.ini` | ✅ 一致 |
---
### 2.2 升级包结构对照
#### **MCU升级包(一致)**
```
文档描述:
update_mcu.zip
├── cortex-gdm4.bin
└── ValidationFile.ini
实际代码:
McuM3Update.java:446
File updateFile = new File(unzippedPath + "cortex-gdm4.bin");
McuM3Update.java:450
File signatureFile = new File(unzippedPath + "ValidationFile.ini");
结论:✅ 完全一致
```
#### **SOC升级包(有差异)**
```
文档描述:
update_soc.zip
├── update.zip
└── ValidationFile.ini
实际检测:
StorageVolumeEventListener.java:92
File socFile = new File(path + File.separator + SOC_UPDATE_FILE);
// SOC_UPDATE_FILE = "update.zip"
所以用户插入的U盘里,SOC升级包名称应该是:
update.zip(不是 update_soc.zip)
解压后的文件:
SocUpdate.java:149
File updateFile = new File("/sdcard/zhongqi_soc_update/update.zip");
SocUpdate.java:203
File signatureFile = new File(unzippedPath + "ValidationFile.ini");
实际结构:
update.zip(外层,用户插入U盘的文件)
├── update.zip(内层,真正的OTA包)
└── ValidationFile.ini
结论:❌ 文档描述错误
- 用户U盘里的文件名是 "update.zip",不是 "update_soc.zip"
- 解压后的结构一致
```
---
## 三、详细代码验证
### 3.1 升级包检测逻辑
```java
// StorageVolumeEventListener.java:89-102
File mcuFile = new File(path + File.separator + MCU_M3_UPDATE_FILE);
// MCU_M3_UPDATE_FILE = "update_mcu.zip"
File socFile = new File(path + File.separator + SOC_UPDATE_FILE);
// SOC_UPDATE_FILE = "update.zip"
if (mcuFile.exists()) {
this.mUpdateFiles.add(mcuFile); // 添加MCU升级包
}
if (socFile.exists()) {
this.mUpdateFiles.add(socFile); // 添加SOC升级包
}
```
**结论**:
- MCU检测:`update_mcu.zip` ✅
- SOC检测:`update.zip` ✅(不是 `update_soc.zip`)
---
### 3.2 验证逻辑对照
#### **MCU验证流程**
```java
// McuM3Update.java:427-472
private boolean verify(File zipFile) {
String unzippedPath = "/sdcard/zhongqi_mcu_update/";
// 1. 解压
ZipUtils.unzipFile(zipFile, targetDir);
// 2. 计算哈希
File updateFile = new File(unzippedPath + "cortex-gdm4.bin");
byte[] fileHash = ZipFileVerifier.computeFileHash(updateFile);
// 3. 读取签名
File signatureFile = new File(unzippedPath + "ValidationFile.ini");
byte[] signatureBytes = readSignBytes(signatureFile);
// 4. 加载公钥
String pem = "-----BEGIN PUBLIC KEY-----\n...";
PublicKey publicKey = ZipFileVerifier.loadPublicKey(pem);
// 5. 验证签名
boolean isValid = ZipFileVerifier.verifySignature(fileHash, signatureBytes, publicKey);
return isValid;
}
```
**文档对照**:
- ✅ 解压路径:`/sdcard/zhongqi_mcu_update/`
- ✅ 固件文件:`cortex-gdm4.bin`
- ✅ 签名文件:`ValidationFile.ini`
- ✅ 算法:SHA256withRSA
---
#### **SOC验证流程**
```java
// SocUpdate.java:180-225
private boolean verify(File zipFile) {
String unzippedPath = "/sdcard/zhongqi_soc_update/";
// 1. 解压
ZipUtils.unzipFile(zipFile, targetDir);
// 2. 计算哈希
File updateFile = new File(unzippedPath + "update.zip");
byte[] fileHash = ZipFileVerifier.computeFileHash(updateFile);
// 3. 读取签名
File signatureFile = new File(unzippedPath + "ValidationFile.ini");
byte[] signatureBytes = readSignBytes(signatureFile);
// 4. 加载公钥
String pem = "-----BEGIN PUBLIC KEY-----\n...";
PublicKey publicKey = ZipFileVerifier.loadPublicKey(pem);
// 5. 验证签名
boolean isValid = ZipFileVerifier.verifySignature(fileHash, signatureBytes, publicKey);
return isValid;
}
```
**文档对照**:
- ✅ 解压路径:`/sdcard/zhongqi_soc_update/`
- ✅ 固件文件:`update.zip`(内层)
- ✅ 签名文件:`ValidationFile.ini`
- ✅ 算法:SHA256withRSA
---
### 3.3 文件清理逻辑
```java
// UpdateService.java:394-411
private void deleteFile() {
String soc_path = "/sdcard/zhongqi_soc_update/";
File soc_directory = new File(soc_path);
deleteDirectory(soc_directory);
String mcu_path = "/sdcard/zhongqi_mcu_update/";
File mcu_directory = new File(mcu_path);
deleteDirectory(mcu_directory);
}
```
**文档对照**:
- ✅ 清理SOC目录:`/sdcard/zhongqi_soc_update/`
- ✅ 清理MCU目录:`/sdcard/zhongqi_mcu_update/`
- ✅ 递归删除:`deleteDirectory()`
---
## 四、修正后的正确流程
### 4.1 正确的升级包结构
```
用户U盘中的文件:
MCU升级包:
update_mcu.zip
├── cortex-gdm4.bin
└── ValidationFile.ini
内容:sign=<256字节签名>
SOC升级包:
update.zip(注意:不是 update_soc.zip!)
├── update.zip(内层真正的OTA包)
└── ValidationFile.ini
内容:sign=<256字节签名>
```
---
### 4.2 正确的文件名
| 类型 | U盘文件名 | 解压后固件文件 | 签名文件 |
|------|-----------|----------------|----------|
| **MCU** | `update_mcu.zip` | `cortex-gdm4.bin` | `ValidationFile.ini` |
| **SOC** | `update.zip` | `update.zip`(内层) | `ValidationFile.ini` |
---
## 五、总结
### 5.1 一致的部分 ✅
```
✅ 核心算法:SHA256withRSA
✅ 验证步骤:解压 → 计算哈希 → 读取签名 → 验证签名
✅ MCU升级包结构:update_mcu.zip
✅ MCU固件文件:cortex-gdm4.bin
✅ SOC解压后文件:update.zip
✅ 签名文件:ValidationFile.ini
✅ 公钥硬编码位置:McuM3Update.java / SocUpdate.java
✅ 文件清理逻辑:自动删除临时文件
```
### 5.2 不一致的部分 ❌
```
❌ SOC升级包名称:
文档写的:update_soc.zip
实际代码:update.zip
影响:用户制作升级包时,SOC包名应该是 update.zip,不是 update_soc.zip
```
### 5.3 修正建议
**需要修正文档中的以下内容**:
```
第四章"升级包格式"部分:
错误:
update_soc.zip
修正为:
update.zip
说明:
用户U盘中的SOC升级包名称是 "update.zip",不是 "update_soc.zip"
解压后的内部结构保持不变(内层还是 update.zip)
```
---
## 六、实际流程确认
### 6.1 用户操作流程(修正版)
```
用户制作升级包:
MCU升级:
1. 准备 cortex-gdm4.bin 文件
2. 用私钥签名,生成 ValidationFile.ini
3. 打包成 update_mcu.zip
4. 复制到U盘根目录
SOC升级:
1. 准备 update.zip(OTA升级包)
2. 用私钥签名,生成 ValidationFile.ini
3. 打包成 update.zip(注意:外层也叫 update.zip)
4. 复制到U盘根目录
用户升级:
1. 插入U盘
2. 系统自动检测 update_mcu.zip 或 update.zip
3. 自动验证签名
4. 验证通过后升级
5. 升级完成自动删除临时文件
```
### 6.2 文件命名总结
```
✅ 正确命名:
MCU:update_mcu.zip
SOC:update.zip
❌ 错误命名:
SOC:update_soc.zip(文档错误描述)
```
---
## 七、建议
1. **修正文档**:将文档中的 `update_soc.zip` 改为 `update.zip`
2. **添加说明**:说明SOC升级包外层和内层都叫 `update.zip`,避免混淆
3. **统一命名**:建议未来版本考虑统一命名规范,如:
- MCU:`update_mcu.zip`
- SOC:`update_soc.zip`(需要同时修改代码)
---
**核对完成时间**: 2025-05-07
**核对范围**: 全部核心代码文件
**发现差异**: 1处(SOC升级包名称)
@@ -0,0 +1,457 @@
# 车载系统安全升级流程说明
## 一、核心原理(一句话说明)
采用 **RSA2048 + SHA256** 数字签名技术,确保升级包来源可信、内容完整,防止恶意软件植入。
---
## 二、算法原理
### 2.1 技术组合
```
RSA2048 + SHA256 统称为 SHA256withRSA
- SHA-256:计算文件哈希值(32字节指纹)
- RSA2048:公钥验证签名(2048位密钥强度)
```
### 2.2 三个核心步骤
```
第一步:计算文件的哈希值
固件文件 → SHA-256哈希算法 → 32字节哈希值
第二步:加载用于验证的公钥
PEM格式公钥 → Base64解码 → RSA公钥对象
第三步:验证签名
哈希值 + 签名 + 公钥 → SHA256withRSA验证 → true/false
```
---
## 三、升级流程图
### 3.1 整体流程
```
┌─────────────────────────────────────────────────────────┐
│ 车载系统安全升级流程 │
└─────────────────────────────────────────────────────────┘
用户操作:插入升级U盘
↓
系统检测:发现升级包(update_mcu.zip / update_soc.zip)
↓
┌─────────────────────────────────────┐
│ 安全验证阶段(用户不可见) │
├─────────────────────────────────────┤
│ 1. 解压ZIP包 │
│ ├─ 固件文件(cortex-gdm4.bin/update.zip)│
│ └─ 签名文件(ValidationFile.ini) │
│ │
│ 2. 计算固件哈希值 │
│ 固件文件 → SHA-256 → 32字节哈希 │
│ │
│ 3. 读取签名 │
│ ValidationFile.ini → 提取sign=字段 │
│ │
│ 4. 验证签名 │
│ 公钥解密签名 → 对比哈希值 │
└─────────────────────────────────────┘
↓
├─ ✅ 验证通过
│ ↓
│ 继续升级流程
│ ↓
│ ┌─────────────────┐
│ │ SOC升级: │
│ │ UpdateEngine安装 │
│ └─────────────────┘
│ ┌─────────────────┐
│ │ MCU升级: │
│ │ 串口传输固件 │
│ └─────────────────┘
│ ↓
│ 升级完成
│ ↓
│ 自动删除临时文件
│ ↓
│ 显示升级成功
│
└─ ❌ 验证失败
↓
中止升级
↓
自动删除临时文件
↓
显示验证失败提示
```
---
## 四、升级包格式
### 4.1 SOC升级包
```
update.zip(注意:U盘中的文件名)
├── update.zip (内层OTA升级包)
└── ValidationFile.ini (签名文件)
内容格式:sign=a1b2c3d4e5...(512个十六进制字符)
```
**⚠️ 重要说明**:
- U盘中的文件名是 `update.zip`(不是 `update_soc.zip`)
- 解压后的内层文件也叫 `update.zip`(双层同名结构)
### 4.2 MCU升级包
```
update_mcu.zip
├── cortex-gdm4.bin (MCU固件)
└── ValidationFile.ini (签名文件)
内容格式:sign=a1b2c3d4e5...(512个十六进制字符)
```
### 4.3 升级包命名对比
| 类型 | U盘文件名 | 解压后固件文件 | 签名文件 |
|------|-----------|----------------|----------|
| **MCU** | `update_mcu.zip` | `cortex-gdm4.bin` | `ValidationFile.ini` |
| **SOC** | `update.zip` | `update.zip`(内层) | `ValidationFile.ini` |
### 4.4 ValidationFile.ini格式说明
```ini
sign=<256字节的十六进制签名字符串>
示例:
sign=a1b2c3d4e5f67890abcdef...(共512个字符)
```
---
## 五、核心代码实现
### 5.1 验证入口
```java
// 验证入口位置
McuM3Update.java:427 // MCU验证入口
SocUpdate.java:180 // SOC验证入口
// 验证流程
private boolean verify(File zipFile) {
// 步骤1: 解压ZIP
ZipUtils.unzipFile(zipFile, targetDir);
// 步骤2: 计算哈希
byte[] fileHash = ZipFileVerifier.computeFileHash(updateFile);
// 步骤3: 读取签名
byte[] signatureBytes = readSignBytes(signatureFile);
// 步骤4: 加载公钥
PublicKey publicKey = ZipFileVerifier.loadPublicKey(pem);
// 步骤5: 验证签名
boolean isValid = ZipFileVerifier.verifySignature(
fileHash, signatureBytes, publicKey
);
return isValid;
}
```
### 5.2 核心验证算法
```java
// 1. 计算SHA-256哈希
public static byte[] computeFileHash(File file) {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
digest.update(buffer, 0, bytesRead);
}
return digest.digest(); // 32字节哈希值
}
// 2. 加载公钥
public static PublicKey loadPublicKey(String publicKeyPEM) {
// 去除PEM头尾标记
String pemFormatted = publicKeyPEM
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s", "");
// Base64解码
byte[] decoded = Base64.getDecoder().decode(pemFormatted);
// 构造RSA公钥对象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decoded);
return keyFactory.generatePublic(keySpec);
}
// 3. 验证签名
public static boolean verifySignature(
byte[] fileHash,
byte[] signatureBytes,
PublicKey publicKey
) {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(fileHash);
return signature.verify(signatureBytes);
}
```
---
## 六、安全保证
### 6.1 三重安全机制
```
┌────────────────────────────────────────┐
│ 第1层:文件完整性(防篡改) │
│ SHA-256哈希校验,任何修改都会导致签名失效│
├────────────────────────────────────────┤
│ 第2层:数字签名(防伪造) │
│ RSA2048私钥签名,无官方私钥无法伪造 │
├────────────────────────────────────────┤
│ 第3层:自动清理(防残留) │
│ 升级完成/失败后自动删除临时文件 │
└────────────────────────────────────────┘
```
### 6.2 安全性指标
| 安全项 | 技术参数 | 安全等级 |
|--------|----------|----------|
| 密钥强度 | RSA2048 | 军工级 |
| 哈希算法 | SHA-256 | 抗碰撞 |
| 签名长度 | 256字节 | 不可伪造 |
| 验证准确性 | 100% | 确定性 |
---
## 七、异常处理流程
### 7.1 验证失败处理
```
验证失败触发条件:
├─ 签名不存在
├─ 签名格式错误
├─ 签名验证不通过
└─ 文件被篡改
处理流程:
验证失败 → 返回VERIFY_FAILURE
→ UpdateService检测状态
→ 自动删除临时文件
→ 提示用户"验证失败,请联系供应商"
```
### 7.2 升级失败处理
```
升级失败触发条件:
├─ SOC升级:UpdateEngine返回错误码
└─ MCU升级:MCU校验失败(0xE4返回非0x01)
处理流程:
升级失败 → 返回INSTALL_FAILED
→ UpdateService检测状态
→ 自动删除临时文件
→ 提示用户"升级失败"
→ 系统恢复原状
```
---
## 八、关键代码位置
### 8.1 核心文件
```
验证核心:
ZipFileVerifier.java - RSA+SHA256验证算法
ZipUtils.java - ZIP解压工具
升级处理:
McuM3Update.java - MCU升级逻辑
SocUpdate.java - SOC升级逻辑
UpdateService.java - 升级服务总控
状态管理:
UpdateState.java - 升级状态定义
```
### 8.2 关键方法
```
验证流程:
McuM3Update.verify() - MCU验证入口(:427)
SocUpdate.verify() - SOC验证入口(:180)
ZipFileVerifier.computeFileHash() - 计算哈希(:48)
ZipFileVerifier.loadPublicKey() - 加载公钥(:30)
ZipFileVerifier.verifySignature() - 验证签名(:19)
文件清理:
UpdateService.deleteFile() - 删除临时文件(:392)
UpdateService.deleteDirectory() - 递归删除(:408)
```
---
## 九、技术参数
### 9.1 算法参数
```
加密算法:RSA2048
- 密钥长度:2048位
- 签名长度:256字节
- 安全等级:军工级
哈希算法:SHA-256
- 哈希长度:32字节
- 抗碰撞性:2^128分之一
- 单向性:不可逆
签名算法:SHA256withRSA
- 标准:Java标准库
- 性能:验证耗时 < 3秒
- 准确性:100%确定性
```
### 9.2 文件参数
```
升级包路径:
SOC:/sdcard/zhongqi_soc_update/
MCU:/sdcard/zhongqi_mcu_update/
内存占用:
哈希计算缓冲区:1024字节
解压临时空间:< 50MB
总内存占用:< 5MB
时间性能:
验证耗时:< 3秒
解压耗时:根据文件大小
升级总耗时:5-15分钟(取决于类型)
```
---
## 十、常见问题
### 10.1 技术问题
**Q1: 为什么选择RSA2048而不是AES?**
```
A: RSA是非对称加密,公钥公开、私钥保密,适合签名验证场景。
AES是对称加密,密钥需要保密,不适合公开验证场景。
```
**Q2: SHA-256有什么优势?**
```
A: SHA-256是单向哈希函数,具有:
- 抗碰撞性:无法找到两个相同哈希的文件
- 单向性:无法从哈希值反推文件内容
- 固定长度:任何文件都生成32字节哈希
```
**Q3: 为什么验证需要3秒?**
```
A: 包含三个步骤:
1. 解压ZIP包(~1秒)
2. 计算SHA-256哈希(~1秒,流式计算)
3. RSA签名验证(~1秒)
相比整个升级过程(5-15分钟),3秒可忽略不计。
```
### 10.2 实践问题
**Q4: 如何制作合法的升级包?**
```
A: 需要官方授权的签名工具:
1. 准备固件文件(.bin / .zip)
2. 使用官方签名工具生成签名
3. 打包成ZIP(固件 + ValidationFile.ini)
```
**Q5: 升级失败会影响系统吗?**
```
A: 不会:
- 验证失败:立即中止,删除临时文件
- 升级失败:自动恢复原状
- 断电保护:系统有回滚机制
```
**Q6: 可以复制别人的升级包吗?**
```
A: 可以,但需注意:
- 设备型号必须匹配
- 系统会自动检查版本标识
- 不匹配会被拒绝(VERIFY_FAILURE)
```
---
## 十一、给同事的讲解要点
### 11.1 一句话总结
> "用私钥给文件哈希值签名,车端用公钥验证签名,通过哈希对比判断文件是否官方发布且未被篡改。"
### 11.2 核心流程三句话
```
1. 解压ZIP → 计算固件哈希 → 读取签名
2. 加载公钥 → 验证签名 → 对比哈希
3. 验证通过 → 升级;验证失败 → 中止+清理
```
### 11.3 安全保证三句话
```
1. 私钥只有官方有,无法伪造签名
2. 哈希绑定文件内容,任何修改都会失效
3. 验证失败立即删除,不留安全隐患
```
### 11.4 关键信息速查
```
算法:SHA256withRSA
位置:McuM3Update.java:427 / SocUpdate.java:180
格式:固件 + ValidationFile.ini
验证:< 3秒
安全:军工级
```
---
## 十二、参考文档
- 《RSA2048+SHA256.docx》 - 算法原理说明
- ZipFileVerifier.java - 验证算法实现
- McuM3Update.java - MCU升级流程
- SocUpdate.java - SOC升级流程
- UpdateService.java - 升级服务总控
---
**文档版本**: v1.0
**最后更新**: 2025-05-07
**维护者**: 技术团队
@@ -0,0 +1,83 @@
# 通过RSA2048+SHA256安全升级
## 一. 相关概念
RSA2048+SHA256 统称 `SHA256withRSA` 是 Java标准库提供的数字签名方案。本质是给升级包做"数字签名校验",防止固件被篡改、伪造、升错版本。
```
RSA2048 + SHA256 = SHA256withRSA
SHA-256:计算文件哈希值
RSA2048:公钥验证签名(2048位密钥强度)
```
---
## 二. 车机端验证流程
### 第一步:计算当前哈希值
```
固件文件(升级包) → SHA-256算法 → 当前哈希值(32字节)
```
### 第二步:加载公钥
```
PEM格式公钥 → Base64解码 → RSA公钥对象
```
### 第三步:验证签名
```
① 读取签名:ValidationFile.ini → 提取签名值
② 解密签名:签名值 + 公钥 → 解密 → 原哈希值
③ 对比验证:原哈希值 比对 当前哈希值
相同 → true(验证通过)
不同 → false(验证失败)
```
---
## 三、升级流程
![升级流程图](升级流程图.jpg)
---
## 四、升级包格式
### MCU升级包
```
update_mcu.zip
├── cortex-gdm4.bin (MCU固件)
└── ValidationFile.ini (签名文件)
```
### SOC升级包
```
update.zip (U盘中的文件名)
├── update.zip (内层mpu升级包)
└── ValidationFile.ini (签名文件)
```
### ValidationFile.ini格式
```
sign=<256字节十六进制签名>
```
---
## 五、总结
**原理**:用私钥给升级文件哈希值签名(服务端),车机端用公钥验证签名,通过哈希对比判断文件是否官方发布且未被篡改。
**流程**:解压升级包 → 计算哈希 → 读取签名 → 加载公钥 → 验证签名 → 通过则升级,失败则中止。
**安全**:RSA2048在当前技术水平下难以破解,SHA-256抗碰撞性极强,私钥只有官方持有,保证验证结果准确。
服务端用私钥对固件哈希值签名生成升级包,车机端解压后计算固件哈希并用公钥验证签名,通过对比哈希值判断固件是否官方发布且未被篡改。