You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

关于BLE中IRK与ERK的定义、作用及ST BLE量产设备中密钥配置的技术问询

IRK和ERK是什么?量产BLE设备时是否需要随机化这些密钥?

首先来明确这两个密钥的定义和作用:

1. IRK(Identity Root Key)

  • 核心作用:隐私与身份识别
    IRK是BLE设备用于隐私保护的根密钥。BLE设备为了避免被追踪,会定期更新自己的随机蓝牙地址。已经配对过的设备可以通过IRK来解析这个更新后的随机地址,确认对方身份,无需重新配对。同时,它还会被用来衍生LTK(长期密钥)和CSRK(连接签名解析密钥),为后续的加密通信和数据签名提供基础。

2. ERK(Encryption Root Key)

  • 核心作用:加密与数据完整性
    ERK是用于加密和数据保护的根密钥,同样会参与LTK和CSRK的衍生。在BLE配对过程中,设备会基于ERK生成会话密钥,确保设备之间的通信内容被加密,防止被窃听;同时也能验证数据的完整性,避免通信内容被篡改。

量产时的关键问题:必须随机化这些密钥!

你给出的代码里用固定常量定义IRK和ERK,这在量产场景下是绝对不可取的,原因如下:

  • 严重的安全隐患:如果所有设备共用同一套根密钥,只要其中一台设备的密钥被破解,所有同批次的设备都会暴露在攻击风险中——攻击者可以伪装成你的设备、窃听通信内容,甚至篡改传输的数据。
  • 不符合蓝牙规范的安全要求:蓝牙核心规范明确建议每个设备使用唯一的根密钥,以此保障设备的独立性和通信安全性。

针对量产的建议:

  • 放弃固定常量的写法,为每台量产设备生成唯一的16字节随机IRK和ERK
  • 生成密钥时一定要使用硬件随机数生成器(HRNG),避免使用可预测的软件随机源,确保密钥的不可预测性。
  • 将生成的随机密钥写入设备的非易失性存储(比如内置Flash),然后通过你代码中的aci_hal_write_config_data接口写入BLE控制器的配置区域,替代原来的固定数组。

附上你提供的代码示例:

/**
 * Identity root key used to derive LTK and CSRK
 */
#define CFG_BLE_IRK {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0}
/**
 * Encryption root key used to derive LTK and CSRK
 */
#define CFG_BLE_ERK {0xFE, 0xDC, 0xBA, 0x09, 0x87, 0x65, 0x43, 0x21, 0xFE, 0xDC, 0xBA, 0x09, 0x87, 0x65, 0x43, 0x21}
static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
aci_hal_write_config_data(CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*) BLE_CFG_IR_VALUE);
aci_hal_write_config_data(CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*) BLE_CFG_ER_VALUE);

内容的提问来源于stack exchange,提问作者schanti schul

火山引擎 最新活动