🔐 你知道蓝牙连接里也有“临时会话密钥”吗?
“蓝牙连接不就连上了吗?还整啥密钥?”
——如果你是这么想的,那你可能真的错过了 BLE 的“秘密花园”。
今天我们要聊聊一个 BLE 配对中非常重要但经常被忽略的角色:
临时会话密钥(STK:Short Term Key)
它可能不“长久陪伴”,但它在配对初期可是担任了“安全护送使者”的关键角色。
🎭 一、为什么蓝牙需要临时密钥?
想象一下你是设备A,要和手机B开始一次BLE浪漫连接。
你们还不熟,怎么能一上来就交心(传敏感数据)?
这时就需要“临时密钥”来:
- 临时保护你们的数据传输
- 作为双方互相信任的起点
- 等将来有更强的“长期密钥”后就下线退休
就像初次见面用临时微信加个好友,以后再交换手机号。
🔐 二、STK 到底干了啥?
STK,全称 Short Term Key,是蓝牙配对过程中,用于加密连接阶段的临时密钥。
在蓝牙的三步配对流程中:
阶段 | 目的 | STK 的作用 |
---|---|---|
1. Feature Exchange | 确定双方支持的加密方式 | —— |
2. Key Generation | 计算出 STK | 🧠 |
3. Encryption | 用 STK 加密连接 | ✅ |
当两个设备采用最基本的 Just Works 或 Passkey Entry 方式进行配对时,会使用 STK 加密初始连接通信。
一旦 STK 加密的连接成功,设备就可以交换更重要的密钥,比如:
- LTK(长期密钥)
- IRK(身份识别密钥)
- CSRK(签名密钥)
而 STK 就此完成使命,隐身退场。
💡 三、STK 怎么生成的?
BLE 配对模式不同,生成 STK 的方式也不同。
以下是主流配对方法与 STK 的生成方式:
配对方式 | STK 来源 | 安全性 | 防 MITM |
---|---|---|---|
Just Works | 全 0 或随机数 | ⭐⭐ | ❌ |
Passkey Entry | 基于 6 位 PIN 计算 | ⭐⭐⭐⭐ | ✅ |
Numeric Comparison | 显示比对数值 | ⭐⭐⭐⭐⭐ | ✅ |
OOB(NFC/二维码) | 外部传入密钥 | ⭐⭐⭐⭐⭐ | ✅ |
STK = 加密函数(TK + 公共随机数)
其中 TK(Temporary Key)就是临时的配对密码,可由用户输入、OOB 传输,或直接设为 0(Just Works)。
🕵️ 四、STK 安全不安全?
✅ 优点:
- 快速上手:配对第一步就能用,门槛低;
- 加密通信:保护最初的数据交换;
- 自动替换:后续可以切换为长期密钥。
❌ 缺点:
- 短命:只在初次连接期间使用;
- 容易被中间人劫持(尤其是 Just Works 模式);
- 不能保存:下次连接需重新生成。
所以,STK 只是开场白,不能当整场演讲的主角。
🧪 五、开发实战:怎么配置和使用?
✅ EFR32 中开启配对并使用 STK(默认流程):
// 开启 bonding 和 MITM 保护
sl_bt_sm_configure(SL_BT_SM_bonding | SL_BT_SM_mitm_required, sm_io_capability_display_only);
// 设置为可配对
sl_bt_sm_set_bondable_mode(1);
设备一旦进入配对状态,就会自动生成 STK,并进行加密。
✅ nRF52 中设定配对参数:
ble_gap_sec_params_t sec_params = {
.bond = 1,
.mitm = 1,
.io_caps = BLE_GAP_IO_CAPS_DISPLAY_ONLY,
.min_key_size = 7,
.max_key_size = 16
};
sd_ble_gap_authenticate(conn_handle, &sec_params);
不需要开发者直接操作 STK,BLE 协议栈自动完成生成、使用、废弃流程。
📈 六、一张图总结 STK 的“职场生涯”
[用户发起配对] → [TK生成] → [随机数协商] → [STK生成] → [临时加密通信] → [交换LTK等长期密钥] → [STK退休]
🧠 七、总结一句话:
STK 就像蓝牙世界的“一次性加密令牌”:出现得早、走得快、作用大!
虽然它“短命”,但没有它,就没有后续更高级别的加密建立。
所以,别小看这位 BLE 小角色,在你每一次配对背后,它都“闪亮登场、悄然隐退”。
📚 延伸阅读推荐:
如果你觉得 STK 的故事挺有意思,别忘了点赞、评论支持一波!
还有其他 BLE 协议背后的“隐藏角色”你想了解吗?欢迎留言,说不定下一期就是它!