1. 低功耗蓝牙安全设计的底层逻辑与TRNG的不可替代性
低功耗蓝牙(BLE)从4.0版本开始就在协议栈里内置了配对与加密机制,但很多做智能门锁、医疗贴片、穿戴设备的团队,直到产品送检或者被安全团队打穿之后,才意识到一个致命问题:加密密钥的随机性来源如果不够“真”,整个安全认证体系就是纸糊的。我在过去几年里接触过至少三个因为随机数问题导致配对密钥可预测的案例,其中两个是智能家居类产品,一个是工业传感器网关。这些项目无一例外都在BLE协议栈之上跑着看似完备的认证流程,但最终都倒在了最底层——随机数发生器的质量上。
BLE的安全模型建立在配对过程中生成的**短期密钥(STK)和长期密钥(LTK)**之上。无论是Legacy Pairing还是LE Secure Connections,密钥的生成都离不开随机数。如果这个随机数可以被攻击者预测或者复现,那么后续所有的加密、认证、完整性保护都形同虚设。很多开发者习惯性地调用rand()或者芯片厂商提供的伪随机数接口,觉得“够用就行”,但问题恰恰出在这里:伪随机数发生器(PRNG)的输出空间和种子熵是有限的,在资源受限的BLE设备上,种子往往来自时钟、ADC噪声或者未初始化的内存,这些来源的熵值极低,攻击者通过多次采样和统计分析,完全有可能缩小搜索空间甚至直接复现序列。
TRNG(True Random Number Generator,真随机数发生器)和PRNG的本质区别在于熵源。PRNG是确定性的算法,给定相同的种子必然产生相同的序列;TRNG则从物理世界中提取不可预测的噪声,比如热噪声、环形振荡器的抖动、亚稳态触发器的随机翻转等。这些物理过程在量子层面本身就是不确定的,因此TRNG的输出具有真正的不可预测性。在BLE设备上,TRNG通常以硬件IP的形式集成在MCU内部,比如Nordic nRF52系列、TI CC26xx系列、Silicon Labs EFR32系列等主流BLE SoC都内置了TRNG模块。但硬件有TRNG不代表你就能用好它,这里面的坑比大多数人想象的要深得多。
我见过不少项目,芯片选型时明明标注了“支持TRNG”,但实际代码里却用了一个软件PRNG,问起来就是“硬件TRNG的驱动太复杂了”或者“初始化时间太长影响功耗”。这种取舍在消费级产品上可能还能蒙混过关,但在涉及支付、医疗、门禁等场景下,就是不可接受的安全缺陷。BLE设备的安全认证方案必须从TRNG的熵源质量、初始化时机、健康检测、密钥派生路径四个维度来系统性地设计,任何一个环节的疏漏都可能导致整个安全链条的断裂。
注意:TRNG的“真”是相对的,没有任何物理熵源是绝对完美的。工程上追求的是“统计上不可区分于真随机”,并且要有健康检测机制来发现熵源退化或失效。
2. BLE安全认证中TRNG的核心应用场景拆解
2.1 配对过程中的密钥生成与分发
BLE配对的核心目标是生成一个共享密钥,用于后续链路的加密。在LE Legacy Pairing中,TK(Temporary Key)的生成方式取决于配对方法:Just Works模式下TK固定为0,Passkey Entry模式下TK是6位数字,OOB模式下TK由带外通道提供。只有Passkey Entry和OOB模式才真正涉及随机数的参与,而Just Works模式因为TK固定,实际上没有任何抗中间人攻击的能力。很多产品为了简化用户体验默认使用Just Works,这在安全敏感场景下是绝对要避免的。
到了LE Secure Connections(LESC),情况有了本质改善。LESC使用ECDH密钥交换,双方各自生成一对公私钥,公钥交换后通过Diffie-Hellman计算共享密钥。这里的私钥生成必须使用TRNG,因为私钥的随机性直接决定了ECDH的安全性。如果私钥的生成空间被缩小到比如2^32,攻击者通过暴力搜索或者Pollard's rho算法可以在可接受的时间内恢复私钥,进而推导出共享密钥。nRF52840的CryptoCell模块提供了基于TRNG的密钥生成接口,但很多开发者直接调用nrf_crypto_ecdh_key_pair_generate时并没有检查底层熵源是否已经就绪,这是一个非常隐蔽的坑。
2.2 设备身份认证中的挑战-响应机制
在BLE设备接入网关或者云平台时,常见的做法是设备端生成一个随机挑战(Challenge),网关端用预共享密钥或者设备证书对挑战进行签名,设备端验证签名后再反向发起一次挑战。这个过程中,挑战值的随机性至关重要。如果挑战值可预测,攻击者可以预先计算响应值,重放攻击就变得轻而易举。我见过一个智能门锁的方案,挑战值居然是用millis()函数生成的,攻击者只需要知道设备的大致启动时间,就能把挑战值的搜索空间缩小到几秒钟的范围内。
TRNG在这个场景下的价值在于,它能够保证每次上电、每次认证会话产生的挑战值都是独立且不可预测的。即使攻击者截获了之前所有的认证报文,也无法从中推导出下一次的挑战值。挑战值的长度也需要仔细考量:太短容易被暴力枚举,太长则增加传输开销和功耗。对于BLE这种低带宽场景,通常建议挑战值不少于16字节(128位),这样即使攻击者拥有极大的计算资源,暴力搜索也不可行。
2.3 会话密钥的周期性更新
BLE链路加密使用的会话密钥(Session Key)并不是一成不变的。在LESC中,每次重新连接或者密钥更新时都会生成新的会话密钥。这个更新过程同样依赖TRNG提供新鲜的随机数。如果会话密钥更新时使用的随机数熵不足,那么新旧密钥之间可能存在相关性,攻击者通过分析多个会话的加密流量,有可能恢复出密钥流或者缩小密钥空间。
在实际项目中,我建议将会话密钥的更新周期与BLE的连接间隔(Connection Interval)解耦。BLE的连接间隔通常在7.5ms到4s之间,如果每次连接事件都更新密钥,TRNG的调用频率会非常高,功耗和延迟都会受到影响。合理的做法是基于时间或者数据量来触发密钥更新,比如每5分钟或者每传输1MB数据后更新一次,同时确保每次更新都从TRNG获取足够的熵。
2.4 固件安全启动与安全存储
BLE设备的固件安全启动链中,TRNG用于生成设备唯一的密钥对或者对称密钥,用于固件签名验证和解密。如果这个密钥的生成过程被攻击者控制,那么攻击者可以伪造合法的固件,实现持久化控制。安全存储区域(如Flash的受保护扇区或者芯片内部的OTP区域)中保存的密钥,其初始值也必须来自TRNG。
这里有一个容易被忽视的细节:密钥生成后的销毁。TRNG的输出在用于生成密钥后,相关的中间变量必须及时清零,防止通过内存泄露或者调试接口被提取。很多RTOS提供了memset_s或者explicit_bzero这样的安全清零函数,但开发者往往直接用memset,编译器优化后可能把清零操作优化掉,留下安全隐患。
3. TRNG在BLE SoC上的实操配置与熵源管理
3.1 主流BLE芯片的TRNG模块对比
选型阶段就需要把TRNG的质量和易用性纳入评估。下面这张表是我在实际项目中整理的主流BLE SoC TRNG特性对比,数据来源于各厂商的公开文档和实测经验:
| 芯片型号 | TRNG类型 | 熵源 | 输出速率 | 健康检测 | 典型初始化时间 | 备注 |
|---|---|---|---|---|---|---|
| Nordic nRF52840 | 硬件TRNG | 热噪声 | 约1Mbps | 支持 | <100us | CryptoCell集成,API完善 |
| TI CC2652 | 硬件TRNG | 环形振荡器 | 约500kbps | 支持 | <200us | 需手动使能时钟 |
| Silicon Labs EFR32 | 硬件TRNG | 多源混合 | 约2Mbps | 支持 | <50us | 低功耗模式下可用 |
| Espressif ESP32 | 硬件TRNG | 射频噪声+热噪声 | 约300kbps | 部分支持 | <500us | WiFi/BLE共用 |
| 国产某BLE SoC | 软件PRNG | 时钟+ADC | 不定 | 无 | 无 | 不推荐安全场景 |
从表中可以看出,Nordic和Silicon Labs的TRNG在初始化时间和输出速率上表现较好,适合对功耗和实时性要求高的BLE场景。TI的TRNG需要手动使能时钟,如果忘记这一步,读取到的数据可能是全0或者固定值,这是一个非常危险的静默失败。ESP32的TRNG在WiFi和BLE同时工作时可能存在资源竞争,需要仔细规划调用时机。
3.2 TRNG初始化与健康检测的代码实现
以nRF52840为例,TRNG的初始化并不是简单地调用一个init函数就完事了。Nordic的nrf_crypto库在底层封装了CryptoCell的TRNG,但首次使用前必须确保CryptoCell已经使能并且完成了自检。下面是我在实际项目中使用的初始化流程:
#include "nrf_crypto.h" #include "nrf_crypto_rng.h" ret_code_t trng_init(void) { ret_code_t err_code; // 初始化nrf_crypto子系统 err_code = nrf_crypto_init(); if (err_code != NRF_SUCCESS) { return err_code; } // 初始化RNG模块,使用CryptoCell的TRNG作为熵源 err_code = nrf_crypto_rng_init(NULL, NULL); if (err_code != NRF_SUCCESS) { return err_code; } // 执行一次健康检测,读取32字节并检查是否有明显异常 uint8_t test_buf[32]; err_code = nrf_crypto_rng_vector_generate(test_buf, sizeof(test_buf)); if (err_code != NRF_SUCCESS) { return err_code; } // 简单的健康检测:检查是否全0、全1或者明显的重复模式 bool all_zero = true, all_one = true; for (int i = 0; i < sizeof(test_buf); i++) { if (test_buf[i] != 0x00) all_zero = false; if (test_buf[i] != 0xFF) all_one = false; } if (all_zero || all_one) { return NRF_ERROR_INTERNAL; } // 清零测试缓冲区 memset(test_buf, 0, sizeof(test_buf)); return NRF_SUCCESS; }这段代码的关键点在于健康检测。很多开发者省略了这一步,直接开始生成密钥。如果TRNG因为硬件故障或者时钟配置错误而输出固定值,生成的密钥就是可预测的。健康检测不需要很复杂,但至少要覆盖全0、全1、重复模式这几种常见故障模式。更严格的检测可以使用NIST SP 800-90B推荐的连续测试或者扑克测试,但在资源受限的BLE设备上,简单的统计检测通常就足够了。
提示:nrf_crypto_rng_init的第二个参数可以传入一个种子,但在使用硬件TRNG时应该传NULL,让底层直接从TRNG获取熵。如果传入了软件种子,反而会降低随机性质量。
3.3 低功耗模式下的TRNG使用策略
BLE设备大部分时间处于睡眠状态,TRNG模块如果一直开着,功耗会显著增加。以nRF52840为例,TRNG在连续工作时的电流消耗大约在1mA左右,对于纽扣电池供电的设备来说是不可接受的。合理的策略是按需启动TRNG,用完立即关闭。
具体做法是:在需要生成密钥或者挑战值之前,先唤醒TRNG,等待其稳定(通常几十微秒),读取所需长度的随机数,然后立即关闭TRNG。nRF52840的CryptoCell支持这种按需模式,但需要注意关闭后再次启动时需要重新等待稳定时间。如果频繁地开关TRNG,累积的稳定等待时间可能会影响BLE的连接事件处理,因此建议批量获取随机数,比如一次获取256字节缓存起来,后续的随机数需求从缓存中取,缓存耗尽后再重新启动TRNG。
这里有一个功耗和安全的权衡:缓存随机数可以减少TRNG的启动次数,但缓存本身如果被攻击者读取,就会泄露随机数。因此缓存区域必须放在受保护的内存中,并且在设备进入低功耗模式前清零。我通常会把缓存放在RAM的特定区域,并在链接脚本中将其标记为不可被DMA访问,防止外设意外读取。
4. 设备安全认证方案的完整实现与避坑指南
4.1 基于TRNG的挑战-响应认证流程设计
一个完整的BLE设备安全认证方案,通常包含设备端和网关端两部分。设备端负责生成挑战、计算响应、验证网关的响应;网关端负责验证设备响应、生成自己的挑战、计算响应。下面是我在一个工业传感器项目中实际使用的认证流程:
设备端流程:
- 设备上电后,从TRNG获取16字节随机数作为本次会话的挑战值
challenge_dev。 - 设备将
challenge_dev通过BLE的GATT特征值发送给网关。 - 网关收到后,用自己的设备密钥对
challenge_dev进行HMAC-SHA256计算,得到response_gw,同时生成自己的挑战值challenge_gw(同样来自TRNG),将response_gw和challenge_gw一起返回给设备。 - 设备验证
response_gw是否正确,如果正确,则用自己的设备密钥对challenge_gw计算response_dev,发送给网关。 - 网关验证
response_dev,通过后认证完成,双方派生会话密钥。
这个流程的关键在于双方的挑战值都来自TRNG,且每次认证都是独立的。即使攻击者截获了某次认证的全部报文,也无法重放,因为下一次的challenge_dev和challenge_gw都是全新的随机数。
4.2 密钥派生路径与TRNG的耦合关系
认证完成后,双方需要派生会话密钥用于加密后续通信。常见的做法是使用HKDF(HMAC-based Key Derivation Function)从共享密钥和双方的挑战值中派生出会话密钥。HKDF的salt和info参数中必须包含TRNG生成的随机数,否则不同会话派生的密钥可能相同。
// 会话密钥派生示例 // shared_secret: 认证过程中协商的共享密钥 // challenge_dev: 设备端TRNG生成的挑战值 // challenge_gw: 网关端TRNG生成的挑战值 // session_key: 输出的会话密钥 uint8_t salt[32]; uint8_t info[] = "BLE_SESSION_KEY_V1"; uint8_t session_key[32]; // salt由两个挑战值拼接后哈希得到 uint8_t salt_input[32]; memcpy(salt_input, challenge_dev, 16); memcpy(salt_input + 16, challenge_gw, 16); sha256(salt_input, 32, salt); // HKDF-Expand hkdf_expand(shared_secret, 32, salt, 32, info, sizeof(info) - 1, session_key, 32); // 清零中间变量 memset(salt, 0, sizeof(salt)); memset(salt_input, 0, sizeof(salt_input));这里有一个细节:salt_input的拼接顺序必须固定,否则设备端和网关端计算出的salt不一致,会导致密钥派生失败。我建议在协议文档中明确规定拼接顺序,并且在代码中用宏或者常量来定义,避免不同开发者实现时出现偏差。
4.3 常见问题与排查技巧实录
在实际部署中,TRNG相关的问题往往表现得非常隐蔽,下面这张表整理了我遇到过的典型问题及排查方法:
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 认证偶尔失败,重启后恢复 | TRNG初始化未完成就读取 | 在TRNG读取前增加状态检查 | 等待TRNG就绪标志 |
| 生成的密钥每次相同 | TRNG未使能,读到固定值 | 读取TRNG输出并检查是否变化 | 检查时钟配置和使能位 |
| 功耗异常偏高 | TRNG未关闭 | 用电流表测量睡眠电流 | 用完立即关闭TRNG |
| 认证成功率随温度变化 | 熵源受温度影响 | 高低温测试 | 增加健康检测,失败时重试 |
| 网关端验证总是失败 | 挑战值字节序不一致 | 对比双方日志中的挑战值 | 统一字节序约定 |
| 设备批量生产后部分设备认证失败 | TRNG个体差异 | 统计失败设备的批次 | 增加出厂前的TRNG自检 |
其中**“认证偶尔失败,重启后恢复”**是最常见的问题。根本原因通常是TRNG的初始化时间没有被正确等待。nRF52840的CryptoCell在启动后需要一定的时间来完成自检和熵源稳定,如果在这之前就调用nrf_crypto_rng_vector_generate,可能返回NRF_ERROR_INVALID_STATE或者生成质量不高的随机数。正确的做法是在初始化后轮询状态寄存器,或者使用中断方式等待就绪信号。
另一个值得注意的问题是字节序。BLE协议栈在传输多字节数据时默认使用小端序,但很多加密库(如mbedTLS)在处理大整数时使用大端序。如果挑战值在设备端是小端序,传到网关端后被当作大端序处理,计算出的HMAC就会不一致。我建议在协议设计阶段就明确规定所有多字节数据在网络传输时统一使用大端序,并在代码中显式地进行字节序转换,避免依赖编译器的默认行为。
4.4 量产阶段的TRNG一致性保障
实验室里跑通的方案,到了量产阶段可能会因为芯片批次差异、焊接温度、供电电压波动等因素出现一致性问题。TRNG的输出质量对供电电压和温度比较敏感,尤其是在低电压或者高温环境下,熵源的噪声特性可能发生变化,导致输出随机性下降。
我在一个量产项目中遇到过这样的情况:实验室的10台样机认证全部通过,但量产首批500台中有大约3%的设备在高温老化测试后出现认证失败。排查后发现,这些设备的TRNG在高温下输出速率下降,而认证流程中有一个超时机制,TRNG读取超时后返回了错误,但上层代码没有正确处理这个错误,导致使用了未初始化的缓冲区作为挑战值。解决方案是在TRNG读取失败时进行重试,并且重试次数用尽后进入安全失败模式,而不是继续使用无效数据。
量产阶段还应该增加出厂前的TRNG自检,每台设备在产线上执行一次完整的TRNG健康检测,包括读取指定长度的随机数、检查统计特性、验证密钥生成和认证流程。自检不通过的设备直接标记为不良品,避免流入市场。这个自检流程可以集成到产线测试工装中,增加的时间成本通常不超过2秒,但对于保障批量产品的安全性来说是非常值得的。
5. BLE Mesh与多设备场景下的TRNG挑战
5.1 Mesh网络中的密钥分发与TRNG
BLE Mesh的网络层和传输层使用了多层密钥体系,包括网络密钥(NetKey)、应用密钥(AppKey)、设备密钥(DevKey)等。这些密钥的分发过程(尤其是Provisioning阶段)严重依赖随机数。Provisioner和设备在Provisioning过程中会交换ECDH公钥,并基于此生成会话密钥,如果任何一方的私钥生成使用了弱随机数,整个Mesh网络的安全性都会受到威胁。
在Mesh Remote Provisioning场景中,Provisioner通过一个已经入网的节点(Remote Provisioner)来配置新设备。这个过程中,Remote Provisioner需要转发加密的Provisioning数据,而它本身并不参与密钥生成。但如果Remote Provisioner的TRNG被攻破,攻击者可以伪造Provisioning报文,将新设备引入一个由攻击者控制的Mesh网络。因此,Mesh网络中每个具备Provisioning能力的节点都必须使用TRNG,不能因为它是“辅助角色”就降低安全要求。
5.2 多设备并发认证时的TRNG资源竞争
在网关需要同时与多个BLE设备进行认证的场景下,TRNG可能成为瓶颈。如果网关的TRNG输出速率有限,而多个设备的认证请求同时到达,就会出现排队等待。如果认证协议没有设计好超时和重试机制,可能会导致部分设备认证失败。
我的做法是在网关端维护一个TRNG随机数池,后台任务持续从TRNG读取随机数并填充池子,认证请求到来时直接从池子中取用。池子的大小根据并发设备数量和认证频率来定,通常256字节到1KB就足够了。池子中的随机数有有效期,超过一定时间未使用就丢弃并重新生成,防止随机数被长期缓存后泄露。
注意:随机数池的实现要注意线程安全,多个认证任务并发访问池子时需要加锁。在RTOS环境下,可以使用互斥量或者信号量来保护池子的读写。
5.3 低功耗蓝牙与Flutter/uni-app跨平台开发的TRNG访问限制
现在很多BLE设备的管理App使用Flutter或者uni-app开发,这些跨平台框架在iOS和Android上对BLE的访问能力存在差异。App端通常不直接访问TRNG,因为TRNG是设备端MCU的硬件资源,App端只需要通过BLE GATT接口与设备交互。但App端在生成配对码或者OOB数据时,也需要使用平台提供的安全随机数接口。
iOS上可以使用SecRandomCopyBytes,Android上可以使用SecureRandom,这两个接口在底层都使用了操作系统的熵源,质量是有保障的。但uni-app的跨平台层可能没有暴露这些安全随机数接口,开发者如果使用JavaScript的Math.random()来生成配对码,就会引入严重的安全漏洞。Math.random()的输出是可预测的,攻击者通过观察几个配对码就能推算出后续的配对码。
我建议在Flutter或uni-app项目中,通过原生插件的方式调用平台的安全随机数接口,而不是依赖JavaScript的随机数函数。Flutter可以使用pointycastle库的SecureRandom,uni-app则需要编写原生插件分别调用iOS和Android的安全随机数API。这个工作虽然增加了一些开发量,但对于安全敏感的应用来说是必须的。
6. 从TRNG到完整安全体系的工程化思考
6.1 安全认证方案的层次化设计
一个完整的BLE设备安全认证方案不能只依赖TRNG,而是需要从硬件层、驱动层、协议层、应用层四个层次来构建纵深防御。硬件层提供TRNG的物理熵源;驱动层负责TRNG的初始化、健康检测和功耗管理;协议层定义挑战-响应流程和密钥派生规则;应用层实现具体的认证逻辑和异常处理。
每一层都有其独特的安全考量。硬件层要关注熵源的物理特性是否被篡改(比如通过电压毛刺攻击);驱动层要防止TRNG的输出被调试接口读取;协议层要抵抗重放攻击和中间人攻击;应用层要处理认证失败后的降级策略。只有四个层次协同工作,才能构建一个真正可靠的安全认证体系。
我在实际项目中见过太多“头重脚轻”的方案:应用层的认证协议设计得非常复杂,但底层的TRNG驱动却漏洞百出。攻击者不需要破解复杂的协议,只需要从底层入手,就能绕过整个安全机制。安全强度取决于最薄弱的环节,这个道理在BLE安全领域体现得尤为明显。
6.2 认证失败后的安全降级策略
当TRNG健康检测失败或者认证流程出现异常时,设备应该如何处理?绝对不能简单地“重试直到成功”,因为攻击者可能通过故意触发TRNG故障来迫使设备进入不安全的状态。正确的做法是定义明确的安全降级策略:
- TRNG健康检测失败:设备进入受限模式,只允许执行非安全相关的功能,禁止配对和密钥生成。同时记录故障事件,在下次连接时上报给网关。
- 认证超时:设备断开连接,等待一段时间后重试。重试次数超过阈值后,锁定一段时间(比如5分钟),防止暴力破解。
- 认证响应验证失败:立即断开连接,清除本次会话的所有临时密钥和随机数,记录安全事件。连续失败达到阈值后,设备进入锁定状态,需要物理复位或者管理员解锁才能恢复。
这些策略需要在设备端和网关端同时实现,并且要保持一致。我建议在协议设计阶段就把这些异常场景列出来,逐一确定处理方式,避免在编码阶段临时决定导致行为不一致。
6.3 安全审计与持续监控
设备部署到现场后,安全认证方案的有效性需要持续监控。网关端应该记录每次认证的详细信息,包括时间戳、设备ID、认证结果、使用的挑战值哈希(不记录原始挑战值,防止泄露)、TRNG健康状态等。这些日志可以用于事后审计和异常检测。
如果发现某个设备的认证失败率异常升高,或者认证时间出现规律性波动,可能意味着该设备的TRNG出现了退化或者受到了攻击。定期的固件安全更新也是必要的,一旦发现TRNG驱动或者认证协议存在漏洞,能够及时修复。
我在一个项目中遇到过这样的情况:某批设备在运行6个月后开始出现偶发的认证失败,现场排查发现是TRNG的熵源在长期运行后出现了老化,输出速率下降导致健康检测超时。解决方案是在固件中增加了TRNG的定期自检和熵源重新校准机制,每24小时执行一次完整的健康检测,如果发现异常则提前告警,而不是等到认证失败才暴露问题。
6.4 成本与安全的平衡取舍
不是所有BLE设备都需要最高等级的安全认证。一个售价9.9元的温湿度计和一个售价999元的智能门锁,对安全的要求显然不同。TRNG的使用策略应该根据产品的安全等级来分级:
| 安全等级 | 典型产品 | TRNG要求 | 认证方案 | 密钥更新周期 |
|---|---|---|---|---|
| 基础级 | 温湿度计、手环 | 软件PRNG可接受 | 无认证或简单配对 | 不更新 |
| 标准级 | 智能灯泡、插座 | 硬件TRNG,基本健康检测 | 挑战-响应认证 | 每24小时 |
| 增强级 | 智能门锁、医疗贴片 | 硬件TRNG,完整健康检测 | 双向认证+密钥派生 | 每1小时 |
| 高级 | 支付终端、工业网关 | 硬件TRNG+独立安全芯片 | 证书认证+安全通道 | 每次会话 |
这个分级不是绝对的,具体还要看产品的应用场景和面临的威胁模型。但核心原则是:安全投入应该与资产价值匹配。一个温湿度计被攻破的损失可能只是数据不准,而一个智能门锁被攻破的损失可能是财产损失甚至人身安全。在资源有限的情况下,优先保障高价值场景的TRNG和认证方案。
我在实际工作中总结出一条经验:如果产品经理说“这个功能不重要,随便做做就行”,那大概率就是后面会出问题的地方。安全设计没有“随便做做”的选项,要么不做,要么就做到位。TRNG和认证方案尤其如此,半吊子的实现比完全不实现更危险,因为它会给人一种虚假的安全感。