一、固件签名概述

什么是固件签名?

固件签名,说白了就是给固件打个「数字指纹」。

我刚开始接触这个领域时,觉得签名就是个加密过程。后来踩了坑才明白——签名不是加密,它是「身份证明」。

打个比方:你收到一个快递,包装上贴着发货人的签名和印章。你确认这个签名是真的,才敢拆包用。固件签名干的就是这事。

具体来说,固件签名包含三个要素:

  • 签名者身份——谁签的?是厂商还是第三方?
  • 固件完整性——固件有没有被篡改过?
  • 不可抵赖性——签了就不能说「我没签过」

技术实现上,通常用非对称加密算法。私钥在厂商手里,公钥烧在设备里。设备启动时,用公钥验证固件上的签名。匹配就启动,不匹配就罢工。

核心逻辑:固件签名 = 哈希摘要 + 私钥加密。不是把整个固件加密,而是对固件的「指纹」做签名。

为什么需要固件签名?

这个问题我问过很多刚入行的朋友。他们的第一反应是「防病毒」。嗯,对了一半。

我在一个物联网项目里遇到过真实案例:某款智能门锁,固件没签名。黑客通过OTA升级通道,塞了个恶意固件进去。结果呢?门锁变成了「开门锁」——谁都能开。

固件签名解决的核心问题有三个:

  1. 防止恶意固件注入——没有合法签名的固件,设备直接拒绝
  2. 检测固件篡改——哪怕改了一个比特,签名验证就会失败
  3. 建立信任链——从BootROM到应用固件,层层验证,环环相扣

你想想看,如果设备连自己跑的程序是不是原厂的都搞不清楚,那还谈什么安全?

注意:固件签名不是万能的。它只保证「谁签的」和「有没有被改」,不保证固件本身没有漏洞。签名过的恶意固件,依然是恶意固件。

签名与加密的区别

这个问题我经常被问到。很多人觉得签名就是加密的变种,其实完全两码事。

我用一张表来说明:

对比项 固件签名 固件加密
目的 验证身份和完整性 保护内容不被偷看
密钥使用 私钥签名,公钥验证 公钥加密,私钥解密
输出结果 固件原文 + 签名值 密文(原文不可见)
能否恢复原文 能(签名不改变固件) 能(解密后恢复)
典型场景 OTA升级、安全启动 固件传输、存储保护

举个例子你就明白了:

  • 签名就像你在合同上签字——合同内容公开,但签字证明是你干的
  • 加密就像把合同锁进保险柜——别人看不到内容,但打开保险柜的人不一定是你

实际项目中,我习惯把签名和加密一起用。先签名,再加密。这样既保证「是谁发的」,又保证「路上没人偷看」。

我的经验:千万别把签名密钥和加密密钥混用。我曾经见过一个项目,用同一对RSA密钥既做签名又做加密,结果被侧信道攻击一锅端。分开管理,各司其职。

固件签名的工作流程

下面这张图展示了固件签名的完整流程:

固件签名与验证流程 原始固件 计算哈希值(SHA-256) 私钥加密哈希 → 签名值 固件 + 签名值 打包发布 收到固件 + 签名值 计算固件哈希值(SHA-256) 公钥解密签名值 → 得到原始哈希 比较两个哈希值是否一致 传输 左侧:签名过程(在安全环境中执行) | 右侧:验证过程(在设备上执行)

流程其实不复杂:

  1. 厂商对固件算哈希,得到一串「指纹」
  2. 用私钥加密这个指纹,生成签名值
  3. 固件和签名值一起发布
  4. 设备收到后,用公钥解密签名值,拿到原始指纹
  5. 设备自己算一遍固件的哈希,对比两个指纹
  6. 一致就通过,不一致就拒绝

关键点:整个过程中,固件本身是明文的。签名只是附加在固件后面的一小段数据。所以签名不影响固件的执行,只影响固件是否被信任。

常见的签名算法

我这些年用过的签名算法不少,挑几个常用的说说:

算法 密钥长度 签名长度 适用场景
RSA-PSS 2048/4096位 256/512字节 通用嵌入式设备
ECDSA 256/384位 64/96字节 资源受限的MCU
Ed25519 256位 64字节 高性能需求场景

我个人习惯:如果芯片资源够,优先用RSA 2048位。如果Flash和RAM紧张,用ECDSA P-256。Ed25519虽然快,但有些老芯片不支持。

避坑指南:我曾经在一个项目里用了RSA 1024位签名,觉得够用。结果两年后安全审计被要求升级到2048位,整个产线都得改。现在我的底线是:新项目起步就是RSA 2048或ECDSA P-256,别给自己挖坑。

小结

固件签名不是什么黑科技,它就是给固件贴了个「防伪标签」。没有它,你的设备就像没锁门的房子——谁都能进。

记住三点:

  • 签名 ≠ 加密,各管各的事
  • 签名解决的是「谁发的」和「改没改」
  • 选算法时留点余量,别省那点资源

嗯,这一章就聊到这。下一章我们深入讲讲签名算法的具体实现和代码示例。

可可精品资料库