尧图精选

低功耗蓝牙终端身份认证实战:TRNG与安全落地

🕒 发布时间:2026/9/20 6:30:47 📁 来源:尧图网络
低功耗蓝牙终端的安全认证是这两年做物联网硬件绕不开的一个坎。我最早接触这块是在一个智能门锁项目上当时产品已经小批量出货结果被安全团队用一台笔记本加一个几十块钱的抓包模块在十分钟内复现了伪造开锁指令——问题就出在BLE链路的身份认证形同虚设配对阶段用的还是最基础的Just Works模式密钥协商过程完全裸奔。那次之后我花了将近三个月时间把BLE从链路层到应用层的认证机制重新啃了一遍也踩了不少TRNG真随机数发生器相关的坑。这篇内容就是把这套经验整理出来讲清楚低功耗蓝牙物联网终端的身份认证到底该怎么做、TRNG在其中扮演什么角色、以及实际落地时哪些细节最容易翻车。适合正在做BLE终端固件、物联网安全方案、或者被安全审计卡住的硬件工程师和嵌入式开发者参考不需要你对蓝牙协议栈有很深的前置知识但至少要写过BLE的GATT服务。1. 为什么BLE终端的身份认证比想象中更棘手1.1 从一次伪造开锁说起认证缺失的真实代价先把这个案例讲透因为它几乎涵盖了BLE认证的所有典型问题。那款智能门锁用的是某国产BLE SoC配对模式配置为Just Works也就是无确认、无密钥交换的裸配对。攻击者只需要在门锁广播时发起连接利用配对过程中的明文特征就能推导出后续通信的加密密钥。更致命的是应用层的开锁指令没有做二次签名校验只要链路层加密被解开指令就是明文可读、可重放的。这里要澄清一个很多人混淆的概念BLE的链路层加密不等于应用层身份认证。链路层加密解决的是这条链路别人偷听不到但它不解决连上来的这个设备到底是不是合法设备。Just Works模式下任何设备都能完成配对并建立加密链路加密密钥是双方临时协商的攻击者作为中间人完全可以各连一边。所以身份认证必须做在应用层链路层加密只是第一道防线。我后来复盘正确的做法应该是三层防护叠加链路层用带MITM保护的配对模式Passkey或Numeric Comparison应用层做基于挑战-响应的双向认证关键指令再加一层数字签名。这三层里随机数的质量直接决定了每一层的安全性这就引出了TRNG的问题。1.2 链路层加密和应用层认证的分工边界很多团队在方案评审时会争论到底要不要自己做应用层认证理由是芯片厂商说链路层已经加密了。这个说法对但不完整。我把两者的职责边界列清楚防护层解决的问题典型机制失效场景链路层加密防窃听、防链路层篡改AES-CCM、配对密钥协商Just Works被中间人、密钥泄露应用层认证确认对端设备身份合法挑战-响应、证书、预共享密钥随机数可预测、密钥硬编码指令级签名防重放、防伪造指令HMAC、数字签名、计数器计数器回绕、签名算法弱从表里能看出来链路层加密失效的场景恰恰是应用层认证要补的位。而应用层认证的核心是挑战值——服务器发一个随机数给终端终端用密钥对它做运算返回服务器验证。如果这个随机数可预测攻击者就能提前算好响应值认证直接绕过。所以随机数质量是应用层认证的命门这也是为什么标题里把TRNG和身份认证放在一起讲。1.3 物联网终端对认证方案的特殊约束和手机、电脑不一样物联网终端做认证有一堆现实约束这些约束直接决定了方案选型。我总结了几条最要命的算力有限很多终端跑的是Cortex-M0/M4主频几十兆跑不动RSA-2048这种重运算ECC P-256已经是上限。内存紧张RAM可能只有几十KB证书链、密钥材料都得精打细算。功耗敏感纽扣电池供电的设备认证握手多几轮就可能少活几个月。无稳定时钟很多终端没有RTC或者RTC精度很差基于时间戳的防重放机制容易失效。量产密钥注入每台设备的密钥怎么安全地写进去产线环节本身就是个大坑。这些约束叠加起来意味着你不能照搬互联网那套TLS双向认证得做裁剪和取舍。后面几节我会具体讲怎么在这些约束下把认证做扎实。2. TRNG在BLE认证链路里到底管什么用2.1 伪随机和真随机的差距一个可预测的nonce如何毁掉整套认证先讲清楚TRNG和PRNG伪随机数发生器的本质区别。PRNG是确定性的算法给定相同的种子输出序列完全一致。TRNG是从物理熵源热噪声、环形振荡器抖动、亚稳态等提取随机性理论上不可预测。在BLE认证里随机数用在三个地方配对阶段的密钥生成、应用层认证的挑战值nonce、以及会话密钥的派生。这三处任何一处用了弱随机数整套认证就可能崩盘。我见过最离谱的案例是某终端直接用rand()函数生成挑战值而srand()的种子是固定的编译时间戳——这意味着每次上电后生成的挑战值序列完全一样攻击者抓一次包就能预测后续所有认证。注意很多芯片的硬件随机数外设在低功耗模式下会关闭唤醒后第一次读取可能返回全0或固定值。这个坑我在nRF52系列上遇到过必须在读取前确认外设已稳定或者丢弃前若干个采样值。2.2 熵源从哪来芯片内置TRNG与外部熵源的取舍大部分主流BLE SoC都内置了TRNG外设比如Nordic nRF52/nRF53系列、TI CC26xx系列、Silicon Labs EFR32系列。这些内置TRNG的熵源通常是环形振荡器抖动或热噪声质量参差不齐。选型时我一般看两个指标熵率每秒能产出多少比特的真随机和是否通过相关随机性检测如NIST SP 800-22、AIS-31。如果芯片内置TRNG质量不够或者你用的是没有TRNG的低端MCU就得考虑外部熵源。常见方案有专用安全芯片如ATECC608A、SE050内置高质量TRNG还带密钥存储和加密加速是物联网终端的首选。外部TRNG模块成本高一般只在特殊场景用。混合方案用内置TRNG做种子喂给CSPRNG密码学安全PRNG扩展兼顾质量和速度。我的经验是只要预算允许优先上专用安全芯片。它一次性解决了TRNG、密钥存储、加密加速三个问题而且密钥永远不出芯片比在MCU里软实现安全得多。下面这张表是我实际项目里对比过的几款方案方案TRNG质量密钥存储加密加速成本适用场景MCU内置TRNG中等无需软实现部分有低低安全要求、成本敏感ATECC608A高安全存储ECC/AES中主流物联网终端SE050高安全存储全算法中高高安全要求纯软件CSPRNG依赖种子无无极低不推荐用于认证2.3 把TRNG接进认证流程挑战值生成与密钥派生的实操具体怎么用我拿一个典型的挑战-响应认证流程举例。终端和服务器共享一个预置密钥K认证过程如下终端发起认证请求携带设备ID。服务器用TRNG生成一个16字节随机挑战值nonce下发给终端。终端用K对nonce做HMAC-SHA256运算得到响应值resp回传。服务器本地用同样的K和nonce算一遍比对resp。认证通过后双方用nonce和K派生出会话密钥用于后续通信加密。这个流程里nonce必须由TRNG生成且每次认证都不同。终端侧如果也要生成随机数比如主动上报时的会话ID同样得用TRNG。代码层面以nRF52为例读取TRNG的典型写法是#include nrf_crypto.h #include nrf_crypto_rng.h ret_code_t generate_random(uint8_t *p_buff, size_t len) { ret_code_t err nrf_crypto_rng_vector_generate(p_buff, len); if (err ! NRF_SUCCESS) { // 处理错误绝不能降级到弱随机 return err; } return NRF_SUCCESS; }关键点是错误处理不能降级。我见过有代码在TRNG读取失败时直接memset成0或者调用rand()兜底这等于把安全门直接拆了。正确做法是认证流程直接失败宁可设备不可用也不能用弱随机凑合。3. 身份认证方案的选型与落地细节3.1 对称密钥还是非对称基于终端能力的决策树这是方案选型第一个要拍板的问题。对称方案预共享密钥HMAC算力开销小、代码量少但密钥管理麻烦——每台设备的密钥都得安全注入服务器侧要存全量密钥一旦服务器被拖库所有设备沦陷。非对称方案ECC签名/密钥交换终端只需存私钥服务器存公钥泄露风险小但算力开销大。我一般用这个决策逻辑终端是Cortex-M0且无硬件加速优先对称方案配合安全芯片存密钥。终端是Cortex-M4及以上或有ECC加速优先非对称用ECC P-256。安全等级要求极高如金融、门锁非对称安全芯片双保险。这里有个折中方案值得提用安全芯片做非对称运算MCU只负责搬运数据。ATECC608A这类芯片内部就能完成ECDSA签名和ECDH密钥交换MCU不需要有ECC算力等于用几块钱的芯片给低端MCU加了个安全引擎。我在一个Cortex-M0的项目上就是这么干的效果很好。3.2 配对模式的选择Just Works为什么不能用回到开头那个案例。BLE的配对模式有四种Just Works、Passkey Entry、Numeric Comparison、OOB。安全等级从低到高。Just Works没有任何MITM保护只适合完全无敏感数据的场景但凡涉及控制指令、用户数据都不能用。Passkey Entry需要一端显示6位数字、另一端输入适合有显示屏或按键的设备。Numeric Comparison是双方都显示6位数字、用户确认一致适合双方都有显示屏的场景。OOB是通过带外通道如NFC交换配对信息安全性最高但需要额外硬件。物联网终端很多是无屏无按键的这就尴尬了——Passkey和Numeric Comparison都用不了。这时候的常见做法是配对阶段用Just Works建立链路但应用层强制做双向认证。也就是说链路层加密只当防窃听用真正的身份确认交给应用层。这个组合在实践中是可接受的前提是应用层认证做得足够扎实。3.3 密钥注入与生命周期管理产线环节的坑密钥怎么进到设备里是量产阶段最容易出事的地方。我见过几种做法按安全性从低到高排固件里硬编码所有设备同一个密钥最差一旦泄露全军覆没。产线明文写入每台设备不同密钥但写入过程明文产线人员能拿到。产线加密写入密钥加密后传输设备内解密存储较好。安全芯片内生成密钥在芯片内生成永不导出公钥导出给服务器最佳。最后一种是最理想的。以ATECC608A为例可以在产线让芯片自己生成ECC密钥对然后只把公钥读出来上传到服务器私钥永远锁在芯片里。这样即使产线被渗透也拿不到私钥。缺点是产线需要联网上传公钥流程复杂一些。提示密钥注入环节一定要做产线审计记录每台设备的密钥注入时间和操作员。一旦出现批量安全事件审计日志是追溯源头的唯一手段。4. 从抓包到复现认证流程的验证与攻击面排查4.1 用抓包工具看清认证握手的每一步方案做完不能就算完必须验证。BLE抓包我用得最多的是nRF Sniffer配合Wireshark成本低、上手快。抓包时重点看几个地方配对请求里的AuthReq字段确认MITM标志位是否置位。配对过程中的密钥交换是否暴露了可推导密钥的信息。应用层认证的挑战值是否每次不同、是否有规律。认证失败后设备的行为是否会泄露额外信息。我一般会抓三次完整的认证流程把三次的挑战值拉出来对比。如果发现有重复、递增规律、或者和某些固定值相关基本可以判定随机数有问题。这一步能筛掉大部分低级错误。4.2 重放攻击、中间人攻击的复现与防御验证验证认证方案是否抗重放最直接的办法就是自己重放一遍。用抓包工具录下一次合法的认证响应然后在新的认证会话里把响应值原样发回去看服务器是否接受。如果接受了说明没有防重放机制或者nonce复用。抗重放的标准做法是每次认证的挑战值必须唯一且不可预测服务器侧维护一个已用挑战值的黑名单或时间窗口。对于没有稳定时钟的终端可以用单调递增的计数器配合挑战值服务器记录每台设备的最大计数器值拒绝回退的请求。中间人攻击的验证稍微复杂需要两台BLE设备做转发。核心是看应用层认证能否识别出链路两端不是同一个对端。如果应用层认证是基于预共享密钥的挑战-响应中间人无法伪造响应因为它没有密钥认证会失败。但如果认证只是连上就信中间人就能得逞。4.3 认证失败时的降级陷阱与日志泄露这是最容易被忽视的攻击面。很多设备在认证失败后会友好地降级——比如连续失败几次后允许无认证访问或者返回详细的错误信息密钥错误vs设备不存在。这些行为都是攻击者的信息源。正确的做法是认证失败一律返回统一的模糊错误且不提供任何降级路径。失败次数达到阈值后设备进入锁定状态需要物理复位或管理员解锁。日志方面认证相关的日志不能包含密钥、挑战值等敏感信息只记录成功/失败和时间戳。我在一个项目里就吃过这个亏设备认证失败后返回的错误码区分了密钥错误和设备未注册攻击者据此可以枚举出哪些设备ID是有效的。后来改成统一错误码才堵上。5. 低功耗约束下的认证优化与实测数据5.1 认证握手的功耗拆解与优化空间物联网终端最怕认证流程把电耗光。我实测过一套基于ECC P-256的认证流程在nRF52832上的功耗数据大致如下阶段耗时平均电流单次能耗广播与连接建立约50ms5mA0.25mAs链路层加密协商约30ms6mA0.18mAsECDH密钥交换约120ms8mA0.96mAsECDSA签名验证约80ms8mA0.64mAs应用层挑战-响应约20ms5mA0.10mAs一次完整认证大约消耗2.1mAs。如果设备用CR2032纽扣电池约220mAh理论上能支撑约37万次认证。但如果认证频繁比如每次上报数据都认证续航就会急剧下降。优化方向有几个会话复用认证一次后派生会话密钥后续通信复用定期重新认证、认证结果缓存短时间内重复连接直接复用上次结果、降低认证频率非敏感操作不认证。我在项目里一般设置会话有效期15分钟期间重连不重新认证实测续航提升明显。5.2 会话复用与认证频率的平衡会话复用不是无脑复用得设边界。我的做法是会话密钥有效期15分钟到期强制重新认证。会话内如果检测到异常如指令序列异常、信号强度突变立即作废会话。设备重启后会话作废必须重新认证。服务器侧可以主动吊销会话终端下次通信时重新认证。这套机制在安全性和功耗之间取得了不错的平衡。实测下来正常使用场景下认证频率从每次通信降到每15分钟一次功耗降低约70%。5.3 实测不同TRNG方案对认证耗时的影响最后分享一组TRNG方案对认证耗时影响的实测数据。测试平台是nRF52840认证流程用ECC P-256对比三种随机数来源TRNG方案挑战值生成耗时认证总耗时随机数质量内置TRNG约0.5ms约300ms中等ATECC608A约2ms约310ms高软件CSPRNGTRNG做种子约0.1ms约295ms依赖种子质量从数据看TRNG方案对认证总耗时的影响很小因为ECC运算才是大头所以不要为了省那1-2ms去用弱随机数得不偿失。ATECC608A虽然生成随机数慢一点但质量最高还顺带解决了密钥存储问题综合性价比最高。我个人在实际操作中的体会是BLE终端的身份认证没有一招鲜的方案核心是把链路层加密、应用层认证、随机数质量这三件事都做扎实任何一环偷懒都会成为短板。TRNG看起来是个小细节但它决定了整套认证的地基稳不稳。选型时优先考虑带安全芯片的方案验证时一定要自己动手抓包重放功耗优化要建立在安全不打折的前提下。这套思路我在几个量产项目上验证过虽然前期投入大一些但省去了后期被安全事件追着跑的麻烦。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →