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

12 KiB
Raw Blame History

车载系统安全升级流程说明

一、核心原理(一句话说明)

采用 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格式说明

sign=<256字节的十六进制签名字符串>

示例:
sign=a1b2c3d4e5f67890abcdef...(共512个字符)

五、核心代码实现

5.1 验证入口

// 验证入口位置
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 核心验证算法

// 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 维护者: 技术团队