尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
硬件加密与软件加密怎么选?嵌入式安全实战解析
1. 破解与被破解之间差的不只是算法做嵌入式开发这么多年我见过太多产品死于抄板。有一次一个做IoT门锁的客户找我说他们的固件被人用编程器直接读出来了主控芯片是某款国产ARM Cortex-M4读出的bin文件反汇编之后协议、密钥、通信格式全暴露了。对方拿着这套方案三个月后做出了外观一模一样、功能完全相同的“竞品”。问题出在哪他们其实做了软件加密启动时用AES解密固件Flash里存了密钥。但密钥本身就是明文存在同一个Flash里的攻破的方式简单得让人绝望直接读Flash把密钥抠出来。这时候很多人会问那换成硬件加密不就行了芯片里不是有加密引擎吗但真正做过选型的人知道硬件加密和软件加密根本不是“换个实现”这么简单。它们从原理到成本、从安全边界到开发流程都是两套逻辑。这篇文章不聊玄学纯聊实操。我会从原理层面拆开这两种方案的底层机制再结合具体的芯片型号比如大家熟悉的STM32、ESP32以及带独立安全单元的国产加密芯片讲清楚为什么硬件加密难破、软件加密为什么容易翻车、以及实际项目中到底该怎么选、怎么配、怎么用。这篇文章适合三类人正在做产品选型的嵌入式工程师、被抄板问题困扰的中小团队以及想搞懂安全芯片到底在干什么的硬件爱好者。看完之后你能直接拿里面的思路去评估自己的项目至少不会再犯“把密钥明文存Flash”这种低级错误。2. 硬件加密到底加密了什么——三个被忽视的本质2.1 硬件加密的“安全存储”不等于“加密计算”先说一个很多人混淆的点。硬件加密这个概念覆盖了两件不同的事情安全存储和安全计算。安全存储指的是密钥或者敏感数据存在芯片内部专用的安全区域里这个区域你读不到。常见的实现方式有一次性可编程熔丝OTP fuses出厂时烧录密钥之后物理锁死谁都无法再读。专用的安全存储区和主Flash物理隔离由内部总线访问CPU的调试接口如JTAG/SWD被禁用后外部拿不到任何读写通路。独立的安全单元Secure Element / SE比如ATECC608A、SMEC98SP这类独立加密芯片密钥只存在于芯片内部主控CPU只能通过I2C接口发指令让它执行加解密永远碰不到密钥本身。安全计算则是芯片内部有独立的密码学引擎比如AES/DES/RSA/ECC/SM2/SM4硬件模块能把加解密操作放在一个封闭环境里完成过程中密钥不会出现在内存里也不会被CPU指令流带出来。你发现没有硬件加密的核心防御思路是“隔离”——把钥匙和锁放在一个偷不走的保险柜里而不是把钥匙挂在门外。2.2 安全启动Secure Boot从源头掐死篡改硬件加密的第二个核心能力是安全启动。这个很多人没重视。安全启动的逻辑是这样的芯片上电后ROM里固化的一段代码先运行这段代码出厂时写死物理上不可修改它对Flash中存放的引导程序做签名校验确认引导程序没被篡改后才开始执行。然后引导程序再对App固件做同样的校验一层一层往下验。整个过程的关键点在于签名校验用的公钥或者哈希值放在OTP里烧录后只读不可改。攻击者如果想替换固件首先得过签名校验想绕过校验就得改OTP里的公钥但OTP物理上已经锁死根本改不了。这就把攻击链从“修改固件”逼到了“暴力破解芯片内部的OTP”这一步难度直接上升了几个量级。注意安全启动并不保证固件完全不会被读取它保证的是“被篡改的固件无法运行”。如果要防读还得配合存储加密、读保护或独立SE。2.3 真随机数发生器TRNG和它的隐藏价值第三个经常被忽略的点是TRNGTrue Random Number Generator真随机数发生器。很多开发者以为有随机数发生器就够了但软件实现的伪随机数PRNG是确定性的——如果你知道种子你就能复现所有随机数。对于签名、密钥交换、一次性Token这类应用伪随机数几乎是致命的一旦种子泄露或推断出来整个加密体系就崩了。硬件TRNG则不同它依赖芯片内部的物理噪声比如热噪声、抖动每次生成的结果不可预测。STM32从F2/F4系列开始内置了TRNGESP32也有硬件随机数模块。在涉及密钥生成、加密挑战值Challenge这些场景时必须用TRNG的输出去生成这是硬件加密和软件方案拉开差距的第二个关键维度。3. 软件加密的真实防线与它必然的短板3.1 软件加密的常见方案AES、白盒、代码混淆先说清楚软件加密不是“不安全”的代名词。在很多场景下它足够用。比如与服务器通信时将业务数据做AES-CTR加密后再通过TLS发送。固件完整性简单校验CRC32就够用不需要高强度。对非关键算法做简单的反调试和代码混淆保护。但这些方案都建立在同一个前提下代码和密钥都运行在同一块可被读写的Flash/RAM里。换句话说加密者和攻击者站在同一个物理平台上差别只是攻击者手里多了一把编程器而已。一旦攻击者拿到了你的固件文件bin/hex他有几种廉价但极有效的手段直接搜索密钥密钥在Flash里是连续字节序列AES的密钥是16/32字节特征明显。打开hex编辑器搜索连续的高熵数据段或者在反汇编里找查表操作的调用点密钥很快现形。动态调试用调试器附加到运行中的设备在内存里dump出解密后的明文数据。二进制Patch跳过校验函数、绕过启动检查正常运行被篡改的固件。3.2 白盒密码的“伪安全”陷阱我见过不少团队上“白盒密码”White-Box CryptographyWBC方案。思路是把密钥拆散、混淆进算法代码里使得即使攻击者拿到了整个程序也很难提取出密钥。但这里有个残酷的现实白盒密码在国内外的实践里已经被多次攻破。它本质上是用算法复杂度换密钥安全性但如果设计者水平不够混淆后的代码里仍然能通过模式分析找到轮密钥相关的表和变换。我实测过某个商业WBC库一个研究生花了两周时间用差分攻击就恢复了密钥。不是WBC理论不成立是工程实现太容易出漏洞。3.3 软件加密最大的坑密钥与代码同体总结一下软件加密的根本矛盾——密钥必须驻留在可被读取的存储介质中而存储介质的读取不受约束。你给固件加壳、加混淆只是提高了攻击门槛没有改变物理事实。打个比方你家保险柜的钥匙放在门垫下面。锁很贵门很结实但钥匙的位置太显眼。攻击者只需要弯腰掀开门垫。这不是说软件加密一无是处而是说你要知道它在抵御谁、抵御多久。如果你的产品面对的是“无聊的爱好者随便搞搞”软件加密足够了如果对手是竞品公司花钱找专业逆向工程师软件加密就是一层窗户纸。4. 选型实操什么项目用硬件加密什么项目用软件加密4.1 一张表看清核心对比对比维度硬件加密软件加密密钥存储位置芯片内部安全区/OTP/独立SEFlash/RAM可被读取密钥泄露难度极低概率需物理破解中低难度可离线提取攻击链对抗能防篡改、防调试、防提取只能防篡改防不了提取性能开销加解密由硬件模块完成几乎不占CPUCPU执行算法占用主频资源开发复杂度需理解启动流程、密钥管理流程门槛高直接用密码学库上手快成本影响芯片选型范围变窄或需外挂SEBOM成本增加无额外硬件成本适用场景高价值固件、IoT门锁、支付终端、车机、医疗器械非核心逻辑保护、通信加密、临时方案4.2 一个完整的选型推演以RK3588边缘网关为例如果你的产品用的是RK3588这种带丰富外设的高性能SoC你要意识到它跑的是Linux系统。Linux下软件加密最大的问题是整个系统都在同一片eMMC/NAND里root后什么都能读。对于这种设备我建议的思路是分层第一层可信根Root of Trust。RK3588支持Secure Boot在MaskRom阶段做RSA签名校验。即使eMMC被整个dump下来也无法直接运行一个篡改后的系统。第二层文件系统加密。用dm-crypt/LUKS对用户数据分区做加密密钥放在TEE可信执行环境里比如OP-TEE。这样即使攻击者拿到eMMC读出来的只是一堆密文。第三层业务密钥独立化。把最关键的业务密钥比如云端API key、设备证书私钥放在独立的SE芯片里主系统只能调用不能读取。这种“SoC安全启动文件系统加密独立SE”的组合是当前边缘网关产品比较合理的硬件加密实践。代价是开发周期长需要在BSP层就做好安全集成——如果你已经用了Buildroot/Yocto可以在构建早期就把TEE和BL32流程加进去否则后期加会很痛苦。4.3 中小MCU项目的简洁方案如果你的产品用的是STM32、GD32或ESP32这类MCU选型逻辑会更清晰预算有限、对手不强打开STM32的RDP读保护级别1再配合软件AES加密通信数据。RDP会让外部调试器无法读取Flash内容虽然可以通过攻击手段绕过但对大多数抄板党来说门槛已经很高了。产品价值高、生命周期长建议加一颗独立加密芯片例如ATECC608A或国产SMEC98SP。密钥写到SE里后所有关键认证都走“主控发挑战值SE返回签名结果”的流程主控自己都不知道密钥是什么攻击者dump主控Flash也只能拿到一个黑盒API。4.4 关于国产芯片和加密芯片的一些实测感受我实测过SMEC98SP这类国产加密芯片它在防抄板场景下的思路和ATECC608A类似都是自带算法引擎和密钥分区I2C接口通信。优势在于支持国密SM2/SM3/SM4用于国内项目合规性更好价格也比进口SE有优势。但有个坑它的文档和例程质量参差不齐尤其I2C时序和异常处理部分需要仔细读勘误表。如果你用国产SE务必先拿逻辑分析仪抓I2C波形确认器件在时序边缘情况下行为稳定不要盲信厂商例程。5. 实战落地从加密需求确认到量产部署5.1 需求确认阶段要问自己的四个问题选型之前我建议先做一个安全威胁建模Threat Modeling就是一个简化版的思考过程——不要一上来就堆技术方案。核心是回答四个问题我的固件/数据被泄露后最大的损失是什么是产品被仿冒还是云端服务被薅羊毛攻击者是谁是普通用户、电子爱好者还是专业的逆向团队攻击者手里有什么资源一台编程器还是带电子显微镜的实验室我能在固件更新上投入多少开发资源这四个问题的答案直接决定方案的强度。比如做电子烟充电检测模块对手是DIY玩家软件加密读保护已经绰绰有余做智能门锁对手大概率是专业的团队你至少需要SE或者带安全启动的SoC。5.2 开发阶段密钥怎么生成、怎么下发、怎么回收密钥管理是整个硬件加密方案里最容易出问题的环节。很多方案本身没问题死在密钥的生命周期管理上。我踩过的坑有几个列出来大家直接避不要在生产线上用同一个固定密钥。如果1000台设备都用同一个密钥拿到一台设备破解就能仿冒所有设备。应该做到每台设备独立密钥或者至少按批次区分。可以基于芯片唯一IDUID派生密钥例如使用HMAC-SHA256KmasterUID生成设备密钥。密钥下发的通道要安全。理想的方式是在产线上通过安全的本地工具如读卡器加密卡把密钥写入SE不要让密钥以明文形式出现在生产电脑的硬盘里。如果实在做不到也要在写完密钥后立即销毁明文文件。预留密钥更新/销毁机制。SE芯片一般支持内部密钥状态位控制有些支持锁定密钥、有些支持更新。你要在需求阶段就明确设备一旦失联/退网远程是否可以销毁密钥如果不能至少在产品的生命周期规划里加入“密钥到期”概念。5.3 一个可以抄的简易实现STM32 AES硬件加速 读保护给一个最典型的入门组合适合很多中小型项目作为第一步安全加固// 基于STM32L4的AES-GCM加密示例只是框架非完整工程 // 使用硬件CRYP模块避免CPU手动实现AES static void aes_gcm_encrypt(const uint8_t *key, const uint8_t *iv, const uint8_t *plaintext, uint8_t *ciphertext, uint32_t len) { // 初始化AES引擎选择GCM模式 HAL_CRYP_Init(hcryp); // 配置密钥、IV hcryp.Init.KeySize CRYP_KEYSIZE_128B; hcryp.Init.pKey (uint8_t *)key; hcryp.Init.pInitVect (uint8_t *)iv; HAL_CRYP_Encrypt(hcryp, (uint32_t *)plaintext, len, ciphertext, STM32_CRYP_TIMEOUT); // GCM的认证标签生成需要额外API具体看HAL库版本 }代码本身不复杂但真正决定安全强度的不是这几行代码而是密钥从哪里来建议由唯一UID派生或从SE/OTP里读取。IV初始化向量是否每次随机必须用硬件TRNG生成不能复用同一个IV。读保护开了几级RDP level 0是完全开放level 1禁止调试访问Flashlevel 2是永久锁定不可回退。如果你不是特别需要现场调试生产版本直接开level 2。5.4 量产阶段容易出现的问题量产时最容易翻车的细节是密钥写入节奏。很多中小团队是在SMT贴片后通过烧录器在最终测试阶段写入密钥。这个阶段要注意烧录过程中SE和主控之间的I2C/SPI通信要做好总线隔离防止其他外部设备偷听。写密钥的操作日志要保留但日志里不要记录密钥本身只记录哈希值或批次号方便追溯。如果采用UID派生密钥方案产线上只需要写入一个主密钥Kmaster设备密钥在首次启动时动态计算。这种方案的好处是生产线不需要处理成千上万个不同密钥缺点是主密钥一旦泄露整批设备沦陷。所以主密钥必须保存在HSM硬件安全模块或至少是加密U盘里绝不能出现在普通电脑里。6. 容易翻车的边界情况电源、通信与SD NAND这些隐藏风险点选型和技术方案都定了实际测试时还会遇到一些教科书不会写的问题我挑几个常见又隐蔽的分享。6.1 加密芯片的供电别乱接如果你用的是独立SE芯片注意它的供电对噪声很敏感。SE内部的真随机数发生器和物理防篡改电路需要稳定的电源域供电纹波过大可能导致SE偶发通信失败或认证失败。我在某次量产中就遇到过一批SE芯片在同一测试工位上有概率性I2C ACK失败排查很久才发现是工位电源纹波超标。后来在SE VCC上增加了一颗10uF低ESR电容和磁珠滤波问题立即消失。6.2 I2C/SPI总线的时序要抓逻辑分析仪SE芯片的通信时序通常比普通传感器苛刻。不要只依赖示波器看波形宏观务必用逻辑分析仪按波特率的4倍以上采样率抓取完整时序尤其关注START/STOP条件、ACK位、以及高负载下总线上拉电阻是否足够。我建议使用2.2kΩ-4.7kΩ上拉并根据SE数据手册的上升时间要求做确认。6.3 存储介质选择也会影响安全边界有些项目为了省成本用普通SPI NOR Flash存固件然后靠MCU的OTP里的公钥去验签。这种做法在理论上是安全的但有一个边界问题NOR Flash可以被离线改写。如果你的公钥OTP没锁好或者芯片的调试接口没有完全关闭攻击者可以把整个Flash拔下来用编程器擦掉再写一个他自己的固件进去。所以如果你的固件量很大、且里面含高价值算法我建议优先考虑带物理防篡改能力的存储或者至少选用写保护引脚可以硬件拉死的Flash型号然后在生产阶段将写保护引脚焊到固定电平。这点很多人忽略了因为原理图上那个引脚看起来“不接也能用”。顺带提一句SD NAND这种集成方案在SD卡协议里集成了Flash控制器也开始在国产方案里普及但这类器件默认不提供安全启动支持如果你把它当系统盘用安全设计时要额外关注启动链前端的校验逻辑。6.4 主控去掉晶振/谐振电容后还能工作吗有人问过“主控芯片去掉晶振谐振电容还能工作吗”表面上这是一个和加密无关的问题但在安全场景下它恰恰很关键如果攻击者控制主控的运行时钟可能会影响某些认证过程中的时间基准进而利用侧信道手段破解读写流程。所以安全要求高的设计中建议使用芯片内部的RC振荡器做基准或者对晶振引脚增加探测报警电路这个在防篡改要求高的场景才会做一般项目不需要但你要知道有这种攻击面。7. 常见问题速查表与最终建议问题现象可能原因解决方案RDP等级升级后无法调试连接ST-Link/J-Link报错读保护开启调试接口被禁止这是正常现象生产版本用level 2即可开发阶段先留出回退通道SE芯片I2C通信偶发失败主控读不到SE的ACK应答供电纹波过大、上拉电阻过大、总线电容超标加磁珠和电容滤波、减小上拉电阻、检查PCB走线Secure Boot启动失败上电后芯片没有任何输出签名校验失败OTP中存放的密钥和签名不匹配检查签名工具链的哈希算法和填充方式确认公钥写入顺序固件被dump但仍无法解密攻击者拿到bin文件但无法运行固件加密安全启动生效属预期效果继续加强的是密钥在设备内的存储方式加密芯片选型后供货不稳定交期拉长部分国产SE产能波动大选型时至少准备第二供应商提前验证引脚兼容性最后给出一个朴素的建议安全方案不是越贵越好而是和你的风险模型匹配。如果你的产品只值几十块钱、对手只是玩票性质做一套复杂的SE方案可能比固件被抄更亏。但如果你要在智能门锁、付费内容硬件、医疗或工业设备里做真正的安全防线硬件加密几乎是唯一靠谱的答案。我个人的体会是加密这件事最怕“差不多就行”的心态。你以为加了AES就安全了但实际上密钥就躺在同一个Flash里等着被人捡走。踩过几次坑之后我现在做任何项目的安全方案第一步永远是问攻击者拿到完整固件之后离真正的核心资产还有多远如果一步就能走完那你用的所有加密都是在自欺欺人如果走完需要物理破解和高端设备那么这个方案才算真正立住了。
RELATED

相关推荐

423道 GIT 测试题(含解释) 61 - 80 题

423道 GIT 测试题(含解释) 61 - 80 题

为方便阅读,这里整理了整个系列的索引导航。本系列共 423 道 git 测试题(含简单的题目解释),按每 20 题为一篇进行连载,点击下方链接即可跳转到对应章节,方便你按需查阅、系统复习。 423道 GIT 测试题(含解释) 01 - 20 题 423道 GIT 测试题(含解释) 21 - 40 题 423道…

📅 2026/9/8 17:23:02
AI全栈开发实战:从vibe coding到harness×SDD,驾驭不确定性的工程方法论

AI全栈开发实战:从vibe coding到harness×SDD,驾驭不确定性的工程方法论

这两年做AI应用,我最大的感受是:AI全栈开发和传统全栈开发完全是两码事。很多人觉得会调API、会写前后端,再套个大模型就是AI全栈了,真正上手才发现,模型输出不稳定、上下文管理混乱、Agent一跑长链路就崩、成本一天天…

📅 2026/9/8 17:18:02
@expo/image-utils 演进全解:Expo CLI 图像处理核心的版本变迁与源码剖析

@expo/image-utils 演进全解:Expo CLI 图像处理核心的版本变迁与源码剖析

expo/image-utils 演进全解:Expo CLI 图像处理核心的版本变迁与源码剖析 【免费下载链接】expo An open-source framework for making universal native apps with React. Expo runs on Android, iOS, and the web. 项目地址: https://gitcode.com/GitHub_Trendin…

📅 2026/9/8 17:18:02
MORE NEWS

更多资讯

📰

嵌入式硬件开发全流程:从原理图到PCB打样调试实战指南

做嵌入式开发的人,很多是从写代码起步的。点灯、串口、传感器,玩得很顺,但到了真正要把电路画出来、把板子做出来的时候,才发现“软件”和“硬件”中间隔着一整条流水线。我这里的嵌入式硬件开发流程,就是从你确定需求…

📰

freeCodeCamp 前端实战:用 `btn-primary` 让 Bootstrap 按钮成为页面视觉主角

freeCodeCamp 前端实战:用 btn-primary 让 Bootstrap 按钮成为页面视觉主角 【免费下载链接】freeCodeCamp freeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free. 项目地址: https://gitcode.com/Gi…

📰

FPGA实现DDS信号发生器:Verilog代码与调试要点

简介:以FPGA为平台实现直接数字频率合成(DDS)的完整工程资料包,适合数字电路、通信电子线路课程设计,以及备战电子设计竞赛的本科生和研究生。内容不仅包含Verilog源码与仿真工程,还配有视频教学和原理图、…

📰

Drawio 桌面版启动异常 3 分钟修复指南:白屏、卡顿与高分屏模糊快速排查

Drawio 桌面版启动异常 3 分钟修复指南:白屏、卡顿与高分屏模糊快速排查 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 双击 Drawio 桌面版图标,窗口&q…

📰

MATLAB实现9轴IMU卡尔曼滤波姿态解算完整源码

简介:这套基于 MATLAB 的 9 轴 IMU 卡尔曼滤波源码,面向嵌入式开发、机器人或姿态估计方向的工程师与学生,针对加速度计、陀螺仪、磁力计数据易受噪声和漂移干扰的问题,提供一套完整的传感器融合与姿态解算参考实现。压缩包共 15 …

📰

工业控制中NMOS与PMOS选型及驱动电路设计指南

干这行十几年,工业控制板卡上最不缺的就是MOS管。电磁阀驱动、PLC输出、电源防反接、电机调速,哪哪都有它。但每次项目评审,看到不少年轻工程师卡在同一个问题上——这地方到底该用NMOS还是PMOS?驱动电路怎么配?说句实…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬