3、蓝牙配对机制详解:传统配对(Legacy Pairing)、安全简单配对(SSP)、LE Secure Connections

蓝牙配对,说白了就是两个设备互相确认身份、协商密钥的过程。我做了这么多年蓝牙驱动,见过太多因为配对机制没选对而翻车的案例。今天咱们就把三种主流配对方式掰开揉碎了讲清楚。

3.1 传统配对(Legacy Pairing)—— 老古董但还在用

传统配对是蓝牙 2.0/2.1 时代的产物。你想想看,那时候手机还只能打电话发短信,安全需求没那么高。它的核心思路就是:双方输入同一个 PIN 码,然后基于这个 PIN 生成链路密钥。

具体流程是这样的:

  • 第一步:设备 A 发起配对请求,设备 B 响应。
  • 第二步:双方协商输入 PIN 码(通常是 1-16 位数字)。
  • 第三步:各自用 PIN 码、设备地址、随机数,通过 E21/E22 算法生成初始化密钥 Kinit。
  • 第四步:再用 Kinit 生成最终的链路密钥 Kab。

嗯,这里要注意一个致命问题:PIN 码太短。很多设备默认 PIN 是 0000 或 1234,我曾在项目中遇到过客户用蓝牙耳机,PIN 码固定为 0000,结果被隔壁工位的同事用手机轻松连上,直接播放了一首《最炫民族风》…… 尴尬不?

⚠️ 避坑指南:传统配对最大的漏洞在于 PIN 码空间太小。4 位 PIN 码只有 10000 种组合,暴力破解几分钟就能搞定。我曾经在测试中发现,用一台树莓派配合蓝牙嗅探器,不到 3 分钟就能破解一个 Legacy Pairing 的耳机。所以,如果你的产品还在用传统配对,赶紧升级吧。

3.2 安全简单配对(SSP)—— 蓝牙 2.1 的救星

传统配对的问题太明显了,于是蓝牙 2.1 引入了 SSP(Secure Simple Pairing)。我个人习惯叫它「安全简单配对」,其实它一点都不简单,只是对用户来说操作简单了。

SSP 引入了 椭圆曲线 Diffie-Hellman(ECDH) 密钥交换,这才是真正的安全基础。它提供了四种关联模型:

关联模型 适用场景 安全级别
Numeric Comparison 两个设备都有显示屏和确认按钮 高(防中间人攻击)
Passkey Entry 一个设备有输入能力,另一个有显示
Just Works 至少一个设备无显示无输入 低(无用户验证)
Out of Band (OOB) 通过 NFC 等带外方式交换信息 高(依赖带外信道安全)

我重点说说 Numeric Comparison,这是我最常用的模型。流程大致是:

  1. 双方通过 ECDH 生成共享密钥。
  2. 各自计算一个 6 位数字的确认值。
  3. 两个设备都显示这个数字,用户确认是否一致。
  4. 如果一致,继续完成配对;否则终止。

你可能会问:「如果中间人篡改了数字怎么办?」 嗯,这里的关键在于:确认值是通过 ECDH 共享密钥和随机数计算出来的,中间人没有共享密钥,无法伪造匹配的确认值。我在项目中测试过,用蓝牙抓包工具尝试中间人攻击,只要用户认真比对数字,攻击就一定会失败。

💡 个人经验:我建议在产品设计时,尽量使用 Numeric Comparison 或 OOB。Just Works 虽然方便,但安全性太差。我曾经帮客户调试一个智能门锁,他们用了 Just Works 配对,结果发现只要在门锁附近放一个蓝牙中继器,就能远程开锁…… 后来改成 Numeric Comparison,问题就解决了。

3.3 LE Secure Connections —— 蓝牙 4.2 的安全升级

到了蓝牙 4.2,LE 引入了 Secure Connections。说白了,就是把 SSP 那套 ECDH 密钥交换搬到了低功耗蓝牙上,并且做了强化。

LE Secure Connections 的核心变化有两点:

  • 使用 P-256 椭圆曲线(而不是 SSP 的 P-192),密钥强度更高。
  • 引入 LE Secure Connections 配对流程,包括阶段 1(配对特性交换)、阶段 2(密钥生成)、阶段 3(传输特定密钥)。

我画个简化的流程图给你看:

阶段 1: 配对请求/响应
  → 交换 IO 能力、认证要求、密钥大小等
阶段 2: 密钥生成
  → ECDH 公钥交换
  → 根据关联模型生成 LTK(长期密钥)
阶段 3: 密钥分发
  → 传输加密信息(EDIV、RAND)
  → 可选传输身份密钥(IRK、CSRK)

这里有个容易踩的坑:阶段 2 中的关联模型选择。LE Secure Connections 支持 Numeric Comparison、Passkey Entry、Just Works 和 OOB,但实现时要注意:

  • 如果两个设备都支持 Secure Connections,必须使用 P-256 曲线。
  • 如果一方不支持,会降级到 LE Legacy Pairing(使用 AES-128 和 STK)。
  • 降级过程中存在安全风险,我建议在代码中强制要求双方都支持 Secure Connections。
⚠️ 我曾经踩过的坑:有一次做蓝牙耳机项目,手机端支持 Secure Connections,但耳机端固件有个 bug,在阶段 2 的 ECDH 公钥交换时,公钥长度校验写错了。结果配对成功了,但加密通信时总是断连。查了两天才发现是公钥长度少了一个字节。所以,一定要严格校验 ECDH 公钥的格式和长度,别偷懒。

3.4 三种配对方式的对比总结

特性 传统配对 SSP LE Secure Connections
蓝牙版本 2.0/2.1 2.1+ 4.2+
密钥交换 PIN 码 + E21/E22 ECDH (P-192) ECDH (P-256)
防中间人攻击 ❌ 无 ✅ 有(Numeric Comparison/OOB) ✅ 有(更强)
适用场景 老设备兼容 经典蓝牙设备 低功耗蓝牙设备
用户交互 输入 PIN 比对数字/输入密码 同 SSP

最后说一句:新项目请直接上 LE Secure Connections。传统配对和 SSP 的 Just Works 模式,能不用就别用。安全这东西,你永远不知道攻击者会从哪个角度钻进来。我在蓝牙安全领域摸爬滚打这么多年,最大的体会就是:别给攻击者留任何机会