Files
Obsidian/项目文档/犀重/车载系统安全升级流程说明.md
2026-11-05 14:35:04 +08:00

458 lines
12 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.
# 车载系统安全升级流程说明
## 一、核心原理(一句话说明)
采用 **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
**维护者**: 技术团队