多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

从安全启动到防抄板:嵌入式硬件加密方案全解析

从安全启动到防抄板:嵌入式硬件加密方案全解析 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中读取SRKSuper Root Key哈希用它验证第一个加载的引导程序SPL/ATF然后一级一级传递信任直到内核和根文件系统。应用处理器SoC方案与MCU方案最大的不同在于它不仅验证启动镜像的完整性还引入了机密性保护。什么意思就是除了验签镜像还可以整体加密存储。主控内部有唯一的密钥来自eFuse或CAAM硬件加密引擎启动时解密镜像再执行。这样即使攻击者拆下Flash芯片读出来的也是一堆密文。这类SoC通常会搭配**TEE可信执行环境**使用比如ARM TrustZone技术。在TrustZone架构下硬件被划分为安全世界Secure World和普通世界Normal World。安全启动的验签逻辑、密钥管理等敏感操作全部放在安全世界里执行Linux系统和应用跑在普通世界里无法访问安全世界的资源。即使Linux被攻破攻击者也只能拿到普通世界的控制权。这类方案的安全级别最高但复杂度和成本也最高通常在车载信息娱乐系统、智能门锁、边缘计算网关这类高价值设备中才会用。3.4 三线对比一张表看懂差异对比维度通用MCU安全启动MCU独立加密芯片应用处理器SoCTEE代表方案STM32H7、RA系列ATECC608B、SMEC98SPi.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设备则要认真考虑SoCTEE方案利用安全世界实现真正意义上的可信保护。先跑通流程再逐步加固远比一开始就追求最强方案要实际得多。
返回列表