first commit
This commit is contained in:
commit
669f49b1d6
342 files changed
+320811
No files matched your search
@@ -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(验证失败)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、升级流程
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 四、升级包格式
|
||||
|
||||
### 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抗碰撞性极强,私钥只有官方持有,保证验证结果准确。
|
||||
|
||||
|
||||
服务端用私钥对固件哈希值签名生成升级包,车机端解压后计算固件哈希并用公钥验证签名,通过对比哈希值判断固件是否官方发布且未被篡改。
|
||||
Reference in new issue
Block a user