1. 两种加密路线的本质差异
做嵌入式开发和硬件产品的人,应该都遇到过这样一幕:产品刚上市没多久,市面上就出现了外观一模一样的仿制板。拆开一看,主控芯片型号相同,代码被完整读了出来,甚至连产线测试用的串口打印都还留着。这种情况想根治,单靠软件手段几乎做不到,因为软件跑在芯片内部,只要芯片本身不设防,代码和数据就等同于裸奔。
硬件加密和软件加密,核心区别在于到底把“安全信任根”放哪里。软件加密是在通用处理器上用代码实现加解密逻辑,密钥、算法、数据都在CPU的掌控范围内。硬件加密则是把一个或多个安全操作放进独立的物理单元,这个单元自带存储、逻辑电路和防护机制,即便主控被攻破,安全单元内部的东西依然拿不出来。
用生活化的类比来说:软件加密相当于把保险柜钥匙藏在书桌抽屉里,再用一把普通的锁把抽屉锁上。只要有人撬开抽屉,钥匙就到手了。硬件加密则像是银行的金库,钥匙由专人保管,金库墙壁具备防钻防爆能力,即使你把银行大堂砸了,金库内部的保险箱也不会自动打开。
从芯片层面看,硬件加密存在多个形态。最常见的是MCU内部集成加密引擎,比如STM32系列里的AES、DES硬件加速器,它把AES运算变成固定的电路逻辑,执行一条指令就能完成一个轮变换。其次是独立安全芯片,比如ATECC608A、SMEC98SP这类防抄板加密芯片,它们通过I2C或SPI接口挂在主控旁边,所有密钥操作都发生在芯片内部,主控只负责发送命令和接收结果。还有一类是HSM(硬件安全模块),多见于汽车电子、服务器领域,相当于把完整的安全子系统封装成一颗专用芯片。
软件加密则灵活得多,理论上任何能跑代码的CPU都能实现。AES、RSA、SHA这些算法都有成熟的软件库,加解密只是指令序列的问题。开发初期,软件加密上手的门槛非常低,不需要额外采购芯片,不需要改PCB,写几行代码调用库函数就能完成加密通信。
但是,灵活的背后是代价。软件加密的密钥必然存放在某个存储介质里,FLASH、EEPROM、OTP区域,这些区域绝大部分都可以被调试接口、Bootloader漏洞或侧信道攻击读取。一旦攻击者拿到了密钥,整个加密体系就从根上崩塌了。
2. 密钥生命周期:硬件加密的灵魂差异
谈硬件加密,绕不开的一个概念叫做“密钥生命周期”。这也是软件加密很难复制的能力。
一条完整的密钥生命周期,包含生成、存储、使用、更新、销毁这几个环节。在软件加密方案里,密钥生成通常依靠随机数函数,存储在FLASH或文件系统中,使用时由CPU读取并加载到RAM参与运算,更新和销毁更是没有硬件层面的强制约束。任何一个环节被攻击者截获,比如通过调试接口读取RAM、通过Bootloader备份固件提取密钥,整条链路就失效了。
硬件加密方案把密钥生命周期牢牢锁在芯片内部。以独立安全芯片为例,密钥在芯片内部的真随机数发生器(TRNG)中直接生成,生成之后就进入OTP(一次性可编程)或者受保护的Flash区域,外部只能通过特定指令发起与密钥相关的操作,比如用密钥做一次签名、做一次解密,但无法把密钥本身读出来。更新密钥需要走安全通道,销毁密钥也有专门的指令。
“芯片内产生、芯片内使用、芯片内销毁”,这三点是硬件加密的核心。很多工程师容易忽略的是,即便安全芯片本身再强,如果主控与安全芯片之间的通信明文传输,攻击者照样可以通过抓包方式实施中间人攻击。所以,实际方案设计还要在通信链路上加认证机制,比如双向认证、会话密钥协商,防止攻击者直接模拟安全芯片应答。
这里要提一下SMEC98SP这类防抄板加密芯片。它核心的工作方式是“挑战-应答”认证:主控生成一个随机数发送给安全芯片,安全芯片用内部密钥和特定算法计算出响应值返回,主控验证响应值是否正确。因为随机数每次不同,攻击者即便截获了某一次通信数据,也无法推导出下一轮的响应值。这种方案的实现成本低、代码量少,非常适合中小型嵌入式产品的防抄板需求。
软件加密也能做类似的多轮挑战应答,只要主控的运算能力和存储空间允许。但是问题依旧回到那个点上:模拟攻击者如果完全控制了主控,可以通过调试接口动态修改返回值、跳过验证函数,或者直接Patch掉校验流程。硬件方案则从物理层面保证了“密钥不可读取、认证过程不可跳过”,因为认证逻辑固化在芯片内部,主控根本没有机会伪造。
从开发调试角度看,硬件加密在前期会给研发带来一些麻烦。密钥一旦烧录进安全芯片,就没法再读出来,调试阶段如果烧错密钥,只能换一片芯片。所以流程上要格外注意:量产密钥的规划、测试密钥的区分、产线烧录工具链的权限管理,都要提前设计好。我见过不少团队因为密钥管理流程混乱,导致产品上市后无法做安全升级,最后只能返厂更换芯片,代价远大于初期多花的那点安全设计成本。
3. 算法执行效率:别只看标称算力
很多人在比较硬件加密和软件加密时,喜欢拿算力说事,比如硬件加密引擎AES-128单次运算仅需0.几微秒,软件加密可能要几百微秒。但实际上,真正影响系统性能的往往不是加解密本身,而是调用链路和使用场景。
芯片内置硬件加密引擎,本质上是在CPU旁边挂了专用的运算单元。CPU只负责送入待加密数据和取出结果,中间的轮运算全部由物理电路完成。这样做的优势不仅仅是快,更重要的是释放了CPU时间片。比如一个网关产品需要同时维护多条DTLS或TLS连接,每条连接每秒要处理多次握手运算,如果全部靠软件走RSA,CPU占用率可能直接飙到80%以上,连业务逻辑都没空间跑。用硬件引擎后,握手运算从CPU线程里卸载出去,CPU占用率能降到30%以下。
但硬件加速不是没有代价。首先,芯片要支持对应的算法族。很多低成本MCU只集成了AES引擎,要跑RSA或者ECC还是得靠软件。其次,硬件引擎的使用通常依赖厂商提供的驱动库,这些库往往带有较大RAM占用和复杂的初始化流程。再次,部分芯片的硬件加密引擎与DMA、中断系统的配合有坑,比如连续大批量加密时DMA描述符处理不当,会丢数据或者产生总线错误。
软件加密的优势在于灵活性极高。算法可以随时换,密钥长度可以随意调整,更新固件时甚至可以引入新的加密算法。但在性能上要特别注意几点:首先是内存开销,RSA-2048签名运算大约需要几十KB的临时缓冲区,这对于RAM紧张的单片机来说是致命的;其次是执行时间的不确定性,软件加的随机延时、分支跳转会让加密操作的时间分布呈正态,这恰恰为时序侧信道攻击提供了分析窗口。
硬件引擎设计时普遍考虑了侧信道防护。独立的电源域、数据总线上的掩码处理、运算过程中的随机延时插入,这些是硬件加密模块的常见手段。普通MCU内置的AES引擎是否具备这些防护,要看芯片型号和设计水平,廉价片子上的硬件AES真的就只是一块裸逻辑,功能上能加解密,安全性究竟几何,厂商很少明说。
我个人的选型经验是:产品对功耗、实时性、密钥安全要求高,优先选带硬件加密引擎的主控加独立安全芯片的组合方案;产品以通信保密为主、对物理攻击威胁模型要求不苛时,软件加密加协议层的安全设计也完全够用。
4. 防抄板与固件保护:主角芯片和配角安全芯片的分工
“防抄板”是嵌入式开发者接触硬件加密的最常见入口。但要明确一点,防抄板从来不是靠一个安全措施解决所有问题,而是一个“纵深防御”的体系。
主角是主控芯片自身的防护能力。比如STM32的RDP(读保护)等级,级别1禁止调试接口访问Flash和SRAM,级别2则完全禁用调试接口。GD32的选项字节也提供类似保护。国产物联网芯片中,全志、瑞芯微(比如rk3588)在高安全等级产品中支持Secure Boot启动链校验,代码从BootROM阶段就开始验证签名,任何篡改都会被拒绝启动。这一层防护的意义在于,让攻击者无法轻易从Flash中提取出明文固件。
配角是独立安全芯片,比如ATECC608A或SMEC98SP。它承担的是“认证”和“密钥管理”这两个核心职能。产品上电后,固件通过I2C向安全芯片发起认证请求,安全芯片基于内部密钥与主控进行挑战应答。安全芯片通过与主控固件约定一组业务密钥和算法,主控的所有敏感逻辑都与安全芯片联动。攻击者就算提取了主控Flash中的代码,因为没有安全芯片内部的密钥,也无法正确响应主控的每一次挑战,所以复制出来的板子根本无法正常工作。
在我接触过的项目里,防抄板方案最常见的一处设计失误是:主控在认证失败时只做了一次打印或者延时,然后继续运行。攻击者看到这个现象,直接Patch掉认证失败分支,绕过验证。正确做法是认证失败要影响核心业务逻辑,比如将部分关键数据解密失败的路径与业务绑定,或者往Flash里写入异常计次标记,多次认证失败直接让设备进入不可恢复状态。
从成本角度看,独立安全芯片单颗价格通常在1元至10元之间,具体取决于芯片的安全等级、算法支持、存储容量和封装形式。相比于整个系统的重新开发费用,这笔钱其实花得相当值。但也要注意,不是所有产品都有必要上独立安全芯片。如果产品本身价值不高,仿制成本巨大,软件层面的混淆加MCU读保护已经足够,额外加安全芯片只会增加BOM成本和生产复杂度。
5. 方案选型实用判断:哪个更适合你的场景
没有绝对的安全,只有匹配场景的安全等级。选择硬件加密还是软件加密,我认为核心要看四个维度:产品价值、威胁模型、硬件平台、开发周期。
产品价值决定了攻击者的攻击意愿。一台均价200元的消费类电子,攻击者花大量精力逆向固件、破解安全芯片,经济上不划算;一台单价数万元的工业设备或医疗仪器则完全不同,仿制成功一次就能回本,必须投入相应的防护等级。
威胁模型要理清你要防的是哪类攻击者。是防止普通用户通过串口读Flash,还是防止有电子工程背景的逆向工程师,或者是防止具备专业实验室资源的攻击团队?对应不同威胁,方案设计差异巨大。普通用户级别的防护,MCU读保护加固件加密就够了;专业逆向级别的防护,独立安全芯片是不可或缺的环节;实验室级别的防护,则需要考虑物理屏蔽、动态密钥混淆、安全启动链、远程认证等系统级方案。
硬件平台决定了加密能力的下限。如果你的主控已经是高性能SoC,比如瑞芯微rk3588这类带ARM TrustZone和多级启动校验的芯片,优先利用芯片自身的安全特性作为基础,再根据需求补充独立安全芯片。若是低成本的8位MCU,只有最基础的Flash读保护,那么独立安全芯片几乎是挡拆成本最低的选择。
开发周期上,软件加密的迭代速度快,方便后期调整算法和流程。硬件加密特别是独立安全芯片,需要预留硬件设计、密钥规划、产线烧录的完整周期。如果产品距离量产只有两周,临时新增安全芯片基本不现实,说明产品定义阶段就应该把安全设计纳入考量。
以下是我整理的一个快速判断表:
| 评估维度 | 优先软件加密 | 优先硬件加密 |
|---|---|---|
| 产品利润 | 低,仿制价值不高 | 高,仿制能带来可观收益 |
| 攻击者能力 | 普通用户、业余爱好者 | 电子工程师、专业逆向团队 |
| 主控资源 | CPU性能强、Flash充足 | MCU资源紧张或密钥极其敏感 |
| 密钥安全需求 | 不需要绝对密钥保密 | 密钥必须不可提取 |
| 开发周期 | 短平快,一周内出方案 | 预留2周以上设计联调和产线规划 |
| 量产规模 | 小批量,BOM成本压力大 | 大批量,平摊安全成本可接受 |
6. 常见问题与排查技巧实录
在实际落地中,硬件加密和软件加密都有不少“看着简单、做起来坑多”的环节。我挑几个高频问题,展开说一下排查思路。
第一个典型问题是安全芯片I2C通信不稳定导致偶发性认证失败。按摩尔定律发展,安全芯片功耗低,但I2C上拉电阻配置不当、总线电容过大、线序过长,都会造成时钟拉伸超时或数据错位。很多工程师在实验室用短杜邦线测试一切正常,一上产线或整机装配后就偶发失败。排查思路很直接:先抓I2C总线的波形,看地址应答是否稳定;检查上拉电阻阻值,一般3.3V系统用2.2kΩ到4.7kΩ比较稳妥;然后把时钟频率降到100kHz或更低测试,如果能稳定运行,问题大概率出在信号完整性上。
第二个高频问题是固件升级后安全芯片认证逻辑失效。这种情况多见于密钥版本管理和算法版本管理没有做好。安全芯片内部固件升级了,或者主控侧固件换了加密库的算法模式,结果两侧的密钥派生规则对不上。排查方法是首先确认主控侧正在使用的密钥ID与安全芯片中烧录的密钥ID是否一致,其次确认两边的加密模式和填充方式是否匹配,比如AES-CBC与AES-ECB、PKCS7与ZeroPadding这些细节。
第三个问题是调试阶段把安全芯片“锁死”了。某些安全芯片在连续多次认证失败后会进入锁定状态,要求断电一段时间或走烧录工具重新解锁。这不属于故障,属于正常安全策略。但研发阶段很容易被这个策略坑到,因为调试时经常改动密钥参数,触发多次错误认证。我的经验是:测试密钥与量产密钥分区域管理,测试阶段使用专门的测试密钥,不做失败次数限制或把锁定阈值调高,量产前再统一切换到正式密钥并恢复安全策略。
第四个问题是软件加密在高并发或大数据量场景下卡顿。排查时先确认瓶颈到底在算法运算、内存拷贝还是存储I/O。比如用ESP32做MQTT TLS通信,卡顿原因通常是握手时RSA运算太慢导致吞吐骤降,这时切换到纯AES的PSK会话模式或启用硬件加密加速器,效果立竿见影。另一个和硬件加密引擎有关的坑是中断优先级冲突:部分MCU硬件AES引擎运算时需要独占总线,如果外部中断频繁抢占,会导致加密处理时延抖动,影响实时性。
7. 实操心得与后续扩展方向
真正把硬件加密用明白,我认为关键在于设计阶段就建立起“安全是系统属性”的理念。单一一颗安全芯片不会让你的产品变成堡垒,裸奔的I2C链路、没有防护的调试接口、常量密钥的硬编码,任何一处短板都能让整套安全体系形同虚设。
一个小技巧分享给做量产的朋友:密钥注入务必放到产线流程中,由烧录工装自动完成,避免密钥在开发环境中明文流转。同时工装用到的密钥文件要设置访问权限,专人保管,防止内部泄露。顺利量产一百片之后,你会意识到,这一个细节省下的不只是一堆麻烦,更是产品整个生命周期的信任成本。
从扩展方向看,硬件加密的应用远不止防抄板这一块。OTA升级固件签名验证、设备身份认证、安全通信通道、数据存储加密,都可以复用同一颗安全芯片的密钥体系。做IoT网关的团队,可以在安全芯片基础上建立设备唯一的身份标识,对接云端证书服务,实现一机一密的安全认证。做汽车电子的团队,还能利用安全芯片支持的安全启动和运行时完整性校验,满足功能安全对异常检测的要求。
如果产品规划到了多型号共平台阶段,建议提前把安全芯片的密钥体系抽象成独立模块,不同型号共用一套密钥管理中间件。这样型号扩展时,不需要重复设计安全逻辑,只需在中间件配置中增加新密钥组即可。这也是我在几个长期维护的项目中验证过比较省心的做法,既保持了密钥的独立性,又降低了长期维护成本。