小型无人车的OTA安全方案

香港运输署要求:

目标 建议算法 说明与理由
数字签名 Ed25519(默认)
Ed25519 在 2025 年已成为车载 MCU 与云端常用的高性能安全算法:密钥短、签名快、抗侧信道。
哈希 SHA‑256 业界主流、硬件加速广泛,满足完整性校验与签名输入。
签名文件编码 Base64URL 消除「+」「/」字符对 URL 的冲突,便于 HTTP 传输与日志记录。
flowchart TB
  %% ---------- 密钥对生成 ----------
  subgraph KeypairGeneration ["密钥对生成"]
    direction TB
    Offline["方案1:离线电脑
openssl 生成 Ed25519 密钥对"] Offline --> OfflinePriv["私钥离线保存"] Offline --> OfflinePub["公钥人工分发
(邮箱/钉钉)"] CI["方案2:CI/CD 流水线
脚本自动生成密钥对"] CI --> CIPriv["私钥存放于
CI/CD Secrets"] CI --> CIPub["公钥提交至代码仓
(Tag/发布分支只读)"] end %% ---------- 私钥汇聚到 CI/CD ---------- OfflinePriv --> Secrets["Ed25519 私钥"] CIPriv --> Secrets %% ---------- 公钥烧录 ---------- OfflinePub --> Flash["公钥烧录至 ECU
或随固件交付"] CIPub --> Flash %% ---------- CI/CD 签名与发布 ---------- subgraph SigningRelease ["CI/CD 签名与发布"] direction TB Build["编译固件镜像"] --> Hash["计算 SHA‑256 摘要"] Hash --> Sign["使用私钥签名
Base64URL 编码"] Secrets --> Sign Sign --> Upload["固件 + 签名上传
OTA 服务器"] end %% ---------- 车端验签 --------- Flash --> Download["ECU 下载固件与签名"] Download --> Verify["使用公钥验签
(硬件加速或软件库)"] Verify -->|通过| Install["安装新固件"] Verify -->|失败| Report["上报云端验签失败"]

生成:分车型(离线手动 or CI/CD自动)生成密钥对

公钥分发:手动 or 存储在CI/CD代码仓库中,开发人员自行查看(需确保发布分支或 Tag 锁定后不可再更改)

私钥存储:存储在CI/CD的_Secrets/Musked/Credentials_中

公钥存储:车端

方案1 方案2
分车型密钥对生成 离线计算机手动生成 CI/CD 使用openssl脚本自动化生成
公钥的分发 手动发送(邮箱/钉钉) 存储在CI/CD代码仓库中,开发人员自行查看(需确保发布分支或 Tag 锁定后不可再更改)
私钥存储 存储在CI/CD的_Secrets/Musked/Credentials_中
公钥存储 ECU存储

上传到固件服务器之前,根据车型使用过对应的私钥签名,然后把升级包和签名都上传。

下载完成之后,使用对应{算法}的验签接口(芯片自带的硬件加速接口 or 纯软实现),输入为_升级包签名公钥_,该接口返回验签通过与否(未通过验签,将错误信息反馈到云端)。