1、整套链路:PC 打包工具 (ec_private.pem 私钥) → bin 固件 + manifest → gw (RK3562J,内置 ec_public.pem 公钥) 验签后才允许升级 PCS 固件。
{
"fileName":"xxxxx_V_1_0_2‑xxxxx.bin",
"fileSize": 524288,
"sha256":"64位十六进制字符串",
"signValue":"128位十六进制字符串(R||S)",
"version":"V_1_0_2"
}
2、sha256
用途:固件文件的哈希摘要,用来校验【固件完整性】
- 打包工具:读取完整输出 bin 固件全部字节,做 SHA‑256 运算,得到 32 字节哈希,转成 64 位小写 hex 字符串存入
sha256。 - gw 设备端流程:
- gw把网页上传过来的 bin 完整接收保存到本地;
- gw 对收到的 bin 文件重新计算一遍 SHA‑256;
- 和 manifest 里面
sha256做字节比对。
✅ 相等:文件完整,传输过程没有丢字节、没有被篡改; ❌ 不相等:文件损坏、传输出错,直接拒绝升级。
重点:sha256 只能证明文件有没有损坏,不能证明是不是官方发布固件 。攻击者可以随便修改 bin,重新计算 sha256,伪造一份 manifest,此时 sha256 是匹配的,但固件是恶意固件。 👉 所以只靠 sha256 不足以保证安全,必须搭配 signValue 数字签名。
2、signValue
用途:ECDSA‑secp256r1 (P‑256) 数字签名,用来校验【固件的真实性(身份)】
- 打包工具逻辑:
- 拿 bin 固件算出来的SHA256 哈希摘要 ,用
ec_private.pem私钥做 ECDSA 签名; - 输出 64 字节原始签名:前 32 字节 R,后 32 字节 S,拼接 R||S;
- 转为 128 位小写 hex 字符串存入
signValue。
- 拿 bin 固件算出来的SHA256 哈希摘要 ,用
ECDSA 特性:相同私钥 + 相同固件,每次签名都会生成不同 signValue(内部随机 nonce),但全部合法可验签通过。
- gw设备端验签逻辑(gw 只持有
ec_public.pem公钥,永远没有私钥):
- PTU 读取本地 bin,计算得到本地 sha256 摘要;
- 解析 manifest 的
signValue,还原出 64 字节二进制 (R||S); - 使用设备内置烧录的ec_public.pem 公钥,执行 mbedtls ECDSA 验签:输入【固件 sha256 摘要 + R、S 签名】;
- ✅验签通过:证明这个固件是持有合法私钥的官方打包工具签名发布,允许执行升级;
- ❌验签失败:判定为非法 / 篡改固件,直接拒绝升级,不写入 PCS。
两者分工对比
| 字段 | 保护目标 | 依赖 | 攻击者能否伪造 |
|---|---|---|---|
| sha256 | 完整性:确认文件没有损坏 / 字节被修改 | 仅固件本身 | 可以伪造:篡改 bin,重新计算 sha256 写入 manifest |
| signValue | 真实性:确认固件来自官方打包者 | ec_private.pem 私钥;PTU 内置 ec_public.pem 公钥 | 不能伪造,没有私钥无法生成合法 signValue |
gw 完整校验流程(两个校验缺一不可)
- 网页上传 bin + manifest 到 gw本地存储;
- gw读取 bin,计算本地 sha256;
- 第一步校验:本地 sha256 和 manifest.sha256 是否完全一致,不一致直接拒绝;
- 第二步校验:使用内置公钥对
(sha256摘要, signValue(R,S))执行 ECDSA 验签; - 两个全部通过,才允许执行 PCS 升级;任意一项失败拒绝升级,写日志上报错误给前端网页。
重要:
- 只有 sha256 匹配,但 signValue 验签失败 → 固件被篡改,拒绝升级;
- signValue 验签通过,但 sha256 不匹配 → 传输损坏,拒绝升级。
常见误区
- 误区:signValue 是对 manifest 整个 JSON 签名 ❌ 不是!我们的实现:signValue 签名对象是固件 bin 的 sha256 哈希,不是 manifest 文本。
- 误区:signValue 固定不变 ❌ ECDSA‑P256 每次签名产生随机 nonce,同一个固件、同一套私钥,多次打包得到 signValue 都不一样,全部合法。
- 误区:只要 sha256 一样固件就是官方固件 ❌ sha256 只保证文件字节,不能保证来源;攻击者篡改固件后可以重新生成 sha256,必须依赖 signValue 数字签名做身份认证。
简单通俗比喻
- sha256:相当于文件的指纹,只看文件长什么样;别人可以造一个别的东西,造一个新指纹。
- signValue:相当于官方盖章,只有手里有私钥的人才能盖章;gw手里拿着公章的复印件(公钥)查验这个章是不是真的,没有私钥仿造不出真章。