1. 项目概述:为什么“安全启动”和“防抄板”总是绑在一起
先聊点实际的。做嵌入式产品和物联网硬件的朋友,应该都有过这种经历:自己团队熬了大半年,硬件改了三版、固件迭代了十几轮,好不容易把产品推上市,结果三个月后,市面上出现了外观一模一样、功能几乎相同的竞品。拆开一看,主控芯片相同、PCB走线一致、固件也能跑——明显是被抄板了。
抄板这件事为什么难防?核心在于传统MCU方案的先天缺陷:固件明文存放在外部Flash里,攻击者用逻辑分析仪、编程器甚至一条飞线,就能把固件读出来;PCB的走线、元器件的BOM清单,只要肯花时间就能逆向。更麻烦的是,市面上存在大量低价方案,抄板的人不需要理解你的设计逻辑,只要“复制”就能“粘贴”。
所以这几年“安全启动(Secure Boot)”和“防抄板”几乎成了硬件开发的高频词。安全启动解决的是固件完整性校验问题——设备上电后,先验证固件是否被篡改过,只有签名合法的镜像才能运行;防抄板解决的是产品身份认证问题——通过唯一ID、密钥、加密芯片等手段,让抄板者即使复制了硬件,也无法复制“合法的身份”。
这个项目标题里有一个非常有代表性的关键词:防抄板加密芯片SMEC98SP。这类芯片在业内叫“安全认证芯片”或“加密协处理器”,它的核心逻辑很简单:把密钥放在独立芯片的硬件安全域里,主控每次运行关键逻辑前,都要和它完成一次双向认证,认证失败就不工作。换句话说,抄板的人可以复制所有看得见的电路,但复制不了芯片里那把看不见的密钥。
本文适合几类读者:正在做产品选型的硬件工程师、创业团队的技术负责人、以及所有被“产品被仿冒”困扰的开发者。接下来我会从安全启动的技术原理讲起,对比三类主流芯片方案的优劣,再带大家走一遍完整的防抄板落地流程,最后整理我这些年踩过的一些坑。
2. 方案选型前必须搞懂的底层逻辑
2.1 安全启动:信任链是怎么建立的
先说安全启动。很多初学者以为安全启动就是“上电后检查一下固件对不对”,这个理解太浅了。真正的安全启动,核心在于建立一条完整的信任链(Chain of Trust)。
以最经典的ARM Cortex-M系列为例,完整的信任链包括这么几级:
- 第一级:BootROM。这级固化在芯片内部,出厂后不可修改。BootROM的代码是芯片原厂写的,它的职责是检查下一级引导程序的签名。
- 第二级:Bootloader。通常存放在片内Flash或外部Flash的固定区域。BootROM验证它的时候,用的是一把烧录在芯片eFuse或OTP里的根密钥哈希。
- 第三级:应用固件(App)。Bootloader验证应用固件的签名,验证通过后才跳转执行。
每一级验证上一级,环环相扣,这就是“信任链”。攻击者无论篡改哪一级,链路就会断开,设备拒绝启动。
这里有个关键概念叫信任根(Root of Trust)。信任根必须是非对称加密中的私钥,而且这把私钥永远不能离开芯片。芯片出厂时,原厂会把公钥的哈希烧进eFuse,之后每次启动,BootROM都会用这把公钥去验证下一级的签名。攻击者就算拿到了完整的固件镜像,也无法伪造签名,因为私钥不存在设备里。
我做过一个比喻:安全启动就像银行的金库门禁。你进第一道门需要验证身份证(BootROM验证Bootloader),进第二道门需要验证虹膜(Bootloader验证App)。就算有人复制了你的身份证,也复制不了你的虹膜。
2.2 防抄板:加密芯片到底在防什么
防抄板的逻辑和安全启动不同。安全启动防的是固件被篡改,而防抄板防的是产品被复制。
很多人会把这两个概念混在一起,其实它们是两回事。一个产品可以安全启动做得很强,但依然被抄板;也可以安全启动不完善,但防抄板做得很严密。理想状态下两者结合,但实际项目中往往各有侧重。
加密芯片(如SMEC98SP、ATECC608B这类)的核心价值在于,它提供了一个不可克隆的硬件身份。具体来说有三层功能:
第一层是唯一ID。每一颗芯片出厂时都有一个全球唯一的序列号,这个序列号烧死在芯片内部,无法通过外部接口读取或修改。只要产品逻辑里检测到这个ID不存在于授权数据库,就直接罢工。
第二层是密钥存储与加密运算。密钥生成后存储在芯片的安全存储区内,任何外部接口(I2C、SPI、SWI等)都无法直接读取密钥明文。主控只能把数据发给芯片,芯片在内部完成AES、ECC、SHA等运算,把结果返回给主控。整个过程中密钥不出现,就算用探针去挖芯片封装,最多也只能看到一堆无法还原的密文。
第三层是双向认证。主控验证芯片是否为正品,芯片也验证主控是否来自合法固件。这能防住一种更高级的攻击——攻击者把加密芯片整个拆下来,搬到自己的抄板电路上。
2.3 明确你的安全目标
在进入具体方案对比之前,建议每个团队先想清楚一个问题:你要防的是谁?
这个问题决定了你的成本投入。我见过不少团队一上来就要最强的安全芯片、最低的破解难度,结果成本翻了三倍,产品在市场上根本卖不动。实际上,不同场景的安全需求差异很大:
- 消费电子(如智能家居、小家电):抄板者通常是中小工厂,他们只求“能跑、看起来一样”,不会投入太多精力破解。这时候一款带安全启动特性的主流MCU就够用。
- 工业控制(如PLC、变频器):仿冒者往往具备一定技术能力,而且产品单价高、利润空间大,需要独立加密芯片配合安全启动。
- 医疗设备/车规电子:关乎人身安全,不仅要防抄板,还要防固件被恶意篡改导致安全事故。这类产品通常要求车规级安全芯片,且需要通过相关功能安全认证(如ISO 26262)。
明确了安全目标,选型才不会跑偏。接下来进入正题,看主流芯片方案到底怎么选。
3. 主流芯片方案对比:三条路线各有优劣
3.1 路线一:带安全启动特性的通用MCU
第一类方案是直接在通用MCU上做安全启动。代表型号有STM32H7系列、NXP i.MX RT系列、瑞萨RA系列等。这类芯片的共同点是:在片内集成了安全启动所需的硬件加速器和密钥存储区域。
以STM32H7为例,它的安全启动特性包括:
- OTP区域(One-Time Programmable):用于存储根密钥哈希、设备唯一ID等一次性写入的数据。写进去之后无法修改,也无法读出。
- 硬件加解密引擎:支持AES、RSA、ECC等算法,密钥可以存储在专用的密钥寄存器中,CPU无法直接访问。
- 安全固件安装:支持将引导程序放在内部Flash,并用HSM(硬件安全模块)或外部工具完成签名安装。
- 回滚保护(Rollback Protection):可以设置版本号,只允许升级到更高版本的固件,防止攻击者刷回旧版本的含漏洞固件。
这类方案的最大优势是成本低。不需要额外的加密芯片,一颗MCU全搞定。对于电池供电的IoT设备、简单的传感器节点、消费类电子产品,这条路线的性价比非常高。
缺点也很明显:密钥还是存在主控芯片内部。虽然硬件做了防护,但对于专业攻击者来说,这类消费级MCU的物理防护强度有限。使用激光切割、聚焦离子束(FIB)等设备,理论上是可以提取片上密钥的——当然,这些设备单价几十万到上百万,绝大多数抄板工厂用不起。
适合场景:成本敏感、安全威胁不大、产品迭代快的消费类产品。
3.2 路线二:独立加密芯片/安全认证芯片
第二类方案是给主控外加一颗独立的安全芯片,比如开头提到的SMEC98SP,以及业界非常常见的Microchip ATECC608B、NXP SE050、英飞凌SLB9670等等。这种方案的特点我称之为“安全域物理隔离”。
为什么要物理隔离?先想想纯MCU方案的痛点:一旦主控被攻破,密钥就等于拱手让人。而独立安全芯片把密钥放在一个单独的、不具备通用计算能力的硬件中,主控与它之间只通过通信接口传输指令和结果。攻击者即使完全控制了主控,能做的事情也仅限于“请求芯片执行运算”,永远拿不到密钥本身。
ATECC608B可以说是这一领域的经典样品,它支持:
- ECC P256签名/验签,可用来做固件签名验证
- AES-GCM加解密,适合做通信数据加密
- 内部安全存储,最多可存16把密钥,并且每把密钥都有独立的用途字段(如只能用于签名、只能用于解密)
- 单调计数器,可用于防止设备回滚到旧状态
- 安全启动辅助功能,可以和主控配合完成启动镜像的逐级验签
SMEC98SP的逻辑类似,但更偏向国产化需求。很多做国内市场的团队出于供应链安全考虑,会优先选国产安全芯片。这块的选型要特别注意芯片的算法支持能力、通信接口兼容性(SPI/I2C/SWI)和软件开发套件是否完善。
独立加密芯片的显著优势在于安全性高:芯片通常通过CC EAL4+或更高等级的认证,物理防护能力远强于通用MCU,能够抵抗侧信道攻击、故障注入攻击等专业手段。缺点是成本增加(每颗芯片多花1-10元不等)和开发复杂度提升(需要移植驱动、设计认证流程)。
适合场景:工业设备、医疗器械、网关设备、加密通信模块等安全性要求较高的产品。
3.3 路线三:带安全启动的应用处理器SoC
第三类方案主要面向运行Linux、Android等复杂操作系统的设备,比如树莓派计算模块、NXP i.MX8M系列、瑞芯微RK3568/RK3588、全志T507等。这类SoC的安全启动链更加复杂,但防护能力也更强。
以i.MX8M为例,它的安全启动流程是:BootROM从eFuse中读取SRK(Super Root Key)哈希,用它验证第一个加载的引导程序(SPL/ATF),然后一级一级传递信任,直到内核和根文件系统。
应用处理器SoC方案与MCU方案最大的不同在于,它不仅验证启动镜像的完整性,还引入了机密性保护。什么意思?就是除了验签,镜像还可以整体加密存储。主控内部有唯一的密钥(来自eFuse或CAAM硬件加密引擎),启动时解密镜像再执行。这样即使攻击者拆下Flash芯片,读出来的也是一堆密文。
这类SoC通常会搭配**TEE(可信执行环境)**使用,比如ARM TrustZone技术。在TrustZone架构下,硬件被划分为安全世界(Secure World)和普通世界(Normal World)。安全启动的验签逻辑、密钥管理等敏感操作,全部放在安全世界里执行;Linux系统和应用跑在普通世界里,无法访问安全世界的资源。即使Linux被攻破,攻击者也只能拿到普通世界的控制权。
这类方案的安全级别最高,但复杂度和成本也最高,通常在车载信息娱乐系统、智能门锁、边缘计算网关这类高价值设备中才会用。
3.4 三线对比:一张表看懂差异
| 对比维度 | 通用MCU+安全启动 | MCU+独立加密芯片 | 应用处理器SoC+TEE |
|---|---|---|---|
| 代表方案 | STM32H7、RA系列 | ATECC608B、SMEC98SP | i.MX8M、RK3568 |
| 安全级别 | 中低 | 高 | 很高 |
| 防抄板能力 | 依赖代码逻辑 | 强(密钥物理隔离) | 强(TEE隔离) |
| 额外成本 | 无 | 单颗1~10元 | SoC成本本身就高 |
| 开发复杂度 | 中 | 中高 | 高 |
| 物理攻击抗性 | 弱 | 强(CC EAL4+认证) | 强 |
| 典型产品 | 消费电子、传感器 | 工控、医疗、收费终端 | 车机、边缘网关、高端门锁 |
4. 走向实操:完整的安全启动与防抄板设计流程
4.1 第一步:密钥体系的建立与管理
无论选哪条技术路线,密钥体系都是地基。我见过太多团队在这步栽跟头——要么是密钥太弱,要么是密钥管理混乱,产品上市后才发现所有设备的密钥都一样,被破解一颗就全军覆没。
一个标准的密钥体系至少需要三把钥匙:
根密钥(Root Key):这是整个安全体系的信任根。根密钥私钥应当离线生成,存放在HSM(硬件安全模块)或保险柜中的加密U盘里,绝不能出现在开发者的电脑上。建议由公司的技术负责人或指定的安全管理员保管,项目结束后封存归档。
固件签名密钥(Code Signing Key):用于给每次发布的固件镜像签名。这把密钥可以常驻在CI/CD系统或构建服务器中,但同样建议存放在HSM中,而不是以明文文件形式散落在代码仓库里。
设备唯一密钥(Device Unique Key):每台设备出厂时生成的独立密钥,存储在安全芯片或MCU的OTP区域中。配合芯片的唯一ID,实现“一机一密”。
密钥生成时,建议使用硬件随机数发生器(TRNG)而不是软件伪随机数。软件伪随机数(PRNG)存在周期性和可预测性问题,一旦攻击者掌握种子,所有“随机”密钥都能被复现。而芯片内部的TRNG基于物理噪声源,不可预测。
4.2 第二步:安全启动链的实现
安全启动链的具体实现,以我们最常用的STM32H7平台为例:
第1步:生成密钥对
在构建服务器上生成RSA-2048密钥对(或ECC P256):
# 生成RSA私钥 openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048 # 提取公钥 openssl rsa -in private_key.pem -pubout -out public_key.pem注意,这把私钥仅用于开发阶段测试。量产阶段建议使用HSM生成并保管根密钥,构建脚本只负责向HSM发起签名请求。
第2步:烧录根密钥哈希
将公钥做SHA256哈希后,烧写进芯片的eFuse或OTP区域。STM32H7在CubeProgrammer工具里提供了“OTP编程”界面,可以直接写入。
这一步有个关键细节:烧录eFuse是不可逆操作。一旦写入,就无法修改。所以量产前要在开发板上反复验证,确认公钥哈希正确后再上产线。
第3步:固件签名
发布固件时,对固件镜像做签名:
# 对固件镜像计算哈希,并用私钥签名 openssl dgst -sha256 -sign private_key.pem -out firmware.sig firmware.binBootloader里预留了验签逻辑,启动时先用存储在eFuse中的公钥验证固件签名,验证通过才跳转执行。
第4步:量产镜像制作
量产时,需要把公钥、固件镜像、签名一并打包。这个过程可以写成自动化脚本,接入工厂的烧录工位。烧录顺序建议是:先烧录eFuse(公钥哈希),再烧录Bootloader签名镜像,最后烧录App签名镜像。
厂线烧录务必加入CRC校验和烧录结果回读,防止因烧录器接触不良导致部分设备eFuse数据异常。
4.3 第三步:防抄板认证机制设计
安全启动做完了,接下来是防抄板。前面提到,防抄板的核心思路是“设备与加密芯片双向认证”。我提供一个在实际项目里验证过的通用框架,大家可以按这个思路去实现。
认证流程设计:
假设主控为Master,安全芯片为Slave。主控运行关键业务前,执行以下流程:
- 主控生成随机数Nonce,发给安全芯片;
- 安全芯片用内部存储的私钥对Nonce签名,返回签名结果;
- 主控用芯片的预置公钥验签,验签通过则确认芯片为正品;
- 反向同理:安全芯片也生成随机数,主控用私钥签名,芯片验签。
如果主控验签失败,直接进入“异常模式”——注意,这个“异常模式”最好别是直接死机,而是让设备表面上正常运行,但实际上核心功能不可用,或者定时上报错误日志。这样抄板者很难判断认证到底卡在哪一步。
业务绑定逻辑:
光有双向认证还不够。攻击者如果批量拆了正品芯片,焊到抄板上,依然能通过认证。因此必须把认证结果和业务逻辑绑定。比如:
- 设备每次联网,把安全芯片返回的签名结果连同设备ID一起上报服务器;
- 服务器校验合法后,下发业务密钥或有效期令牌;
- 设备只有拿到合法的业务密钥,才能启动核心服务。
这样即使攻击者复活了芯片,也过不了服务器这关。当然,纯离线设备这个方案不适用,可以采用“功能降级”策略——认证失败时只能运行基础模式,高级功能全部锁定。
4.4 第四步:量产管理与密钥安全落地
最后说说量产。安全方案设计得再好,量产环节一塌糊涂也是白搭。以下是我见过的几种“量产翻车现场”,大家务必引以为戒:
翻车现场一:密钥裸奔。工厂的烧录脚本里,直接明文写着私钥路径。产线工人、技术支持人员都能看到。密钥一经泄露,后续所有安全机制形同虚设。
正确做法:密钥只存在于HSM或离线签名服务器中。产线烧录时,设备向签名服务器发起请求,服务器完成签名后返回签名结果。产线上任何一台电脑都不存储私钥文件。
翻车现场二:一版固件打天下。所有批次的设备都用同一把固件签名密钥,一旦某台设备被攻击者物理提取了密钥,那整个产品线都得报废。虽然设备唯一密钥已经能区分每台设备,但固件签名密钥作为信任链最核心的一环,建议不同批次或不同客户的项目使用不同的子密钥。
翻车现场三:缺少产测环节。设备烧录完安全启动和加密芯片认证后,不进行功能测试就直接发货。结果市场上出现一批“无法通过认证”的故障设备。
正确做法:量产时增加一个“安全功能自检”步骤,产测软件模拟主控向安全芯片发起认证请求,验证芯片返回的签名结果,确认无误后再走下一道工序。
5. 常见问题与排查技巧实录
5.1 为什么安全启动开了,固件还是被读出来了
这是最让我哭笑不得的咨询。很多工程师以为只要开启了安全启动选项,固件就安全了。实际上,安全启动只负责“验签后启动”,如果攻击者绕过了BootROM的验证逻辑,或者直接把外部Flash拆下来用编程器读,安全启动根本拦不住。
排查思路三步走:
- 确认固件是否有加密存储(而不是明文存储)。如果固件在外部Flash里是明文,请务必改为加密存储,密钥放在芯片OTP中。
- 确认调试接口(JTAG/SWD)是否已禁用。很多芯片默认开启调试接口,攻击者可以直接连上调试器读取内存。
- 确认BootROM本身是否支持回滚保护。如果不支持,攻击者可以把Bootloader降级到旧版本,绕过新版本的安全补丁。
5.2 加密芯片通信失败,产品成批变砖
加密芯片作为一个独立器件,同样存在失效风险。最常见的原因是I2C/SPI通信时序不稳,尤其是在低温或电磁干扰环境下。
这个问题我建议从硬件层加固:I2C上拉电阻加大到4.7k欧姆,通信线尽量短且远离高频信号线;软件层加通信重试机制和校验位,连续5次认证失败时进入安全模式并上报状态,而不是死等。
5.3 安全启动验证总是失败,卡在启动阶段
这种问题大概率是“信任根”不匹配。比如eFuse里烧的公钥哈希和Bootloader打包时用的公钥不一致,或者固件签名时用的私钥不是根密钥对应的私钥。
我的排查习惯是:在Bootloader的关键节点(读eFuse、验签、跳转)加串口日志,把每一步的结果打印出来。确认验签失败是在“读取密钥”还是“校验签名”环节。签名校验失败,优先检查密钥匹配关系;读取密钥失败,检查OTP烧录地址是否正确。
5.4 一机一密方案导致的量产效率低
一机一密的初衷是每台设备使用不同的密钥,安全性好,但量产时逐个烧录密钥导致产线上每台设备耗时增加几秒钟,对于大规模量产来说是个成本负担。
这个问题的解决办法是批量预置密钥。安全芯片支持在出厂时批量生成密钥对,烧录到芯片里;产线只需要批量导入密钥对应的公钥清单到服务器或主控中。ATECC608B就支持这种模式,出厂之前可以批量生成几万个密钥区,产线无需逐个烧录。
5.5 上位机仍然能拖固件,安全启动形同虚设
还有一种情况:安全启动做得不错,但产品内的Web升级接口或USB DFU接口保护得不好。攻击者不需要读Flash,直接通过上位机工具就能把固件拖出来。
这类问题本质上不是“安全启动”的范畴,而是“固件泄露防护”和“调试/升级接口访问控制”。建议所有升级接口都增加鉴权逻辑,限制非法访问,生产版本中彻底禁用DFU模式。
5.6 常见问题速查表
| 问题现象 | 可能原因 | 排查重点 |
|---|---|---|
| 启动后进不了系统,卡白屏 | eFuse公钥哈希与固件签名密钥不匹配 | 确认密钥是否对应、OTP烧录是否正确 |
| 系统能启动但功能异常 | 加密芯片认证超时/失败 | I2C/SPI通信电平、芯片地址 |
| 固件被读出来反编译 | 固件未加密存储 | 改为加密存储,密钥入OTP |
| 设备无法升级到新版本 | 回滚保护版本号设置错误 | 检查版本计数器 |
| 量产设备安全认证全挂 | 产测环节缺失 | 增加安全功能自检流程 |
| 攻击者拿到固件但跑不起来 | 签名校验生效但加密未生效 | 建议加解密存储并动态解密 |
6. 扩展思考:安全方案不是一劳永逸的
聊到这儿,很多人会有一个误区:是不是选了一套安全芯片,做了安全启动,产品就绝对安全了?
我的观点非常明确:世界上没有绝对安全的系统,只有成本的博弈。攻击者的投入产出比决定了你的安全方案是否有效。如果你的产品售价几十块钱,攻击者花几万块钱买设备去破解,那大概率不值;但如果你的产品是单价几千块的工业设备,攻击者只要破解一个方案,抄出来的产品卖几十台就能回本,那就值得使用更高级的防护手段。
所以选型的时候,不妨先算一笔账:**你的产品值不值得被破解?破解一次能带来多少利润?**然后再决定安全投入的层级。
另外提醒一点:安全方案一定要预留升级空间。攻防是一个动态博弈过程,攻击者今天用逻辑分析仪,明天可能就上侧信道攻击;今天用的算法被认为安全,明天可能就被发现漏洞。好方案应该支持密钥更新、算法替换、甚至安全芯片型号替换。我见过太多产品把安全方案写死在代码里,后期想升级安全组件,结果整个系统都要推倒重来。
从我个人的经验来看,嵌入式安全这条路的门槛并不在于“会不会用某个芯片”,而在于“有没有全局视野”。你得同时懂硬件防护(eFuse、加密芯片、物理隔离)、懂固件设计(信任链、回滚保护、接口防护)、懂生产流程(密钥管理、产测方案、签名服务器)。这三块缺一块,你的安全防线就是一块短板,攻击者一定会从短板入手。
如果你正在做产品选型,我的建议是:消费类产品优先选带安全启动特性的MCU,把防抄板做成可选配置;工控和医疗产品果断上独立加密芯片,用SMEC98SP或ATECC608B这类方案做主安全,MCU安全启动做辅助;高价值Linux设备则要认真考虑SoC+TEE方案,利用安全世界实现真正意义上的可信保护。先跑通流程,再逐步加固,远比一开始就追求最强方案要实际得多。