1. 固件签名概述

大家好,我是老周。做嵌入式安全这块十几年了,今天咱们聊聊固件签名。

很多人一听到「签名」两个字,第一反应是「哦,就是加密嘛」。其实不是。我见过不少项目,工程师把签名和加密混为一谈,结果出了大问题。咱们这一章就把这个事儿彻底说清楚。

什么是固件签名

固件签名,说白了就是给固件打个「数字指纹」。这个指纹能证明两件事:你是谁,以及固件有没有被人动过。

具体怎么做的呢?

  • 开发者用私钥对固件生成一个签名值
  • 这个签名值附在固件后面一起发布
  • 设备端用公钥验证签名是否匹配

嗯,这里要注意:签名不是把固件藏起来,而是给固件贴个「防拆标签」。你想想看,快递盒上的封条,谁都能看见,但撕掉了你就知道被人动过。签名也是这个道理。

核心概念:固件签名 = 私钥签名 + 公钥验证。私钥只有开发者持有,公钥可以公开。

为什么需要固件签名

我遇到过不少客户,一开始觉得「我的产品又不联网,签什么名?」结果呢?有一次,某厂商的智能电表被逆向工程,攻击者刷入了恶意固件,整个小区的电表数据全乱了。后来他们找我做安全审计,第一件事就是补上固件签名。

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

  1. 防篡改 — 固件在传输或存储过程中被修改,验证会失败
  2. 防伪造 — 没有私钥的人无法生成合法签名
  3. 可追溯 — 每个签名都绑定了特定的开发者或发布者

避坑指南:我曾经见过一个团队,把私钥硬编码在固件里。这等于把家门钥匙放在门口垫子下面。私钥必须保存在安全硬件(如HSM)或隔离环境中,绝对不能随固件发布。

签名与加密的区别

这是最容易混淆的地方。我面试嵌入式工程师时经常问这个问题,能答清楚的不超过三成。

咱们直接看对比:

特性 签名 加密
目的 验证完整性和身份 保护内容机密性
密钥对 私钥签名,公钥验证 公钥加密,私钥解密
输出 签名值 + 原文 密文(原文不可见)
可逆性 不可逆(无法从签名还原原文) 可逆(解密后还原原文)
典型算法 RSA-PSS, ECDSA, Ed25519 AES, RSA-OAEP, ECIES

说白了,签名是「你能看,但不能改」;加密是「你能改,但你看不到」。两者可以组合使用,但功能完全不同。

我个人习惯是:先签名,再加密。这样接收方先解密,再验证签名,流程清晰。反过来也行,但要注意签名值本身也需要保护。

固件签名全流程概览

咱们这一章先搭个框架,后面每个环节都会展开细讲。下面这张图是我自己画的,把整个流程串起来了:

固件签名全流程概览 开发环境 生成密钥对 签名过程 私钥 → 签名值 固件发布 固件 + 签名 设备端验证 公钥 → 验签 验证结果 通过 / 拒绝 💡 关键点 私钥永远不出开发环境 公钥预置在设备只读存储区 开发 → 签名 → 发布 → 验证 → 执行

我的经验:刚开始做签名方案时,别追求最复杂的算法。先跑通 RSA-2048 + SHA-256,这是业界最成熟、工具链支持最好的组合。等流程稳定了,再考虑升级到 ECDSA 或 Ed25519。

什么时候必须用固件签名

不是所有场景都需要签名。但下面这些情况,我建议你认真考虑:

  • OTA 升级 — 固件通过网络传输,中间人攻击风险极高
  • 安全关键系统 — 医疗设备、汽车电子、工业控制器
  • 付费内容或授权管理 — 防止固件被非法复制或篡改
  • 合规要求 — 很多行业标准(如 IEC 62443、ISO 21434)明确要求固件签名

我记得有一次帮一家做智能门锁的客户做安全评估。他们的固件没有签名,攻击者只需要一个 USB 转串口工具,就能刷入任意固件。你想想看,你家门锁能被别人远程「升级」成后门,这多可怕。

嗯,这一章就到这里。固件签名不是什么高深莫测的技术,但它是嵌入式安全的第一道防线。后面咱们会一步步拆解每个环节,包括密钥管理、签名算法选型、联调工具链、常见坑点等等。