【android bluetooth 案例分析 02】【CarLink 详解2】【Carlink无配对连接机制深度解析】
Carlink无配对连接机制深度解析(首次/二次免鉴权原理)
一、核心结论:Carlink通过SDK层协议设计完全绕过传统蓝牙配对
传统蓝牙配对(Pairing)依赖协议栈生成长期绑定密钥(LTK),而Carlink的SDK在应用层实现了无配对但安全的连接,关键设计如下:
技术点 | 传统蓝牙配对 | Carlink方案 |
---|---|---|
密钥管理 | 协议栈生成LTK长期存储 | SDK动态生成会话密钥(每次连接刷新) |
鉴权触发 | 协议栈控制配对流程 | SDK应用层自主完成鉴权 |
身份绑定 | 依赖蓝牙地址 | 使用设备证书+动态Token |
用户交互 | 每次配对需PIN码 | 仅首次需PIN码(SDK自动缓存凭证) |
二、首次连接免重复鉴权原理
1. SDK层替代协议栈的鉴权流程
-
步骤:
-
PIN码验证:用户手动输入车机显示的6位码,SDK将其作为种子生成临时密钥。
-
证书交换:车机SDK发送设备证书(含公钥)给手机,手机SDK验证证书合法性。
-
会话密钥生成:双方通过PIN码和Nonce派生临时AES密钥(仅本次连接有效)。
-
-
关键日志证据:
ATT Write (UUID=0x2ABC...9101):
数据 = [Protocol_Header:0x7B 0x22] + [PIN_Hash:0x69 0x64...]
-
0x7B 0x22:标识为首次连接协议头。
-
0x69 0x64:PIN码的哈希值(非明文),用于密钥派生。
2. 无配对实现
-
绕过协议栈:
SDK直接通过GATT特征(如0x2ABC...9101
)传输鉴权数据,完全规避HCI_LE_Pairing_Request
等协议栈指令。 -
凭证缓存:
SDK将设备证书和公钥存储在应用私有目录(如Android的/data/data/com.carlink/app_bluetooth/
),不与系统蓝牙共享。
三、二次连接免鉴权原理
1. SDK自动恢复安全上下文
- 身份识别:
手机SDK通过蓝牙广播中的**Resolvable Private Address (RPA)**匹配已缓存设备ID:
HCI_LE_Enhanced_Connection_Complete (Peer=50:7C:52:69:41:48 Resolvable)- RPA由首次连接的IRK生成,车机可解析为合法设备。
-
密钥快速重建:
SDK使用首次缓存的公钥参数,通过ECDH快速生成新会话密钥:新会话密钥 = ECDH(手机私钥, 车机公钥) + 本次Nonce
2. 协议栈无关性验证
-
日志分析:
二次连接全程无HCI_LE_Pairing
事件,但存在加密的ATT通信:ATT Write (UUID=0x2ABC…9101):
数据 = [Protocol_Header:0x7B 0x22] + [Encrypted_Token:…]-
0x7B 0x22:标识为二次连接协议头。
-
数据已加密,密钥由SDK动态生成,协议栈无法解密。
-
四、Carlink SDK的关键设计
1. 协议分层架构
┌─────────────────────┐
│ Carlink App │ ← 用户交互(PIN码输入/显示)
├─────────────────────┤
│ Carlink SDK │ ← 鉴权、密钥管理、数据加密
├─────────────────────┤
│ Bluetooth GATT │ ← 纯数据传输(协议栈无状态)
└─────────────────────┘
- 协议栈仅作管道:
GATT传输的ATT数据由SDK加密,协议栈无法解析内容。
2. 安全凭证管理
凭证类型 | 存储位置 | 生命周期 |
---|---|---|
设备公钥证书 | SDK私有目录 | 永久(除非手动清除) |
会话密钥 | 内存 | 单次连接有效 |
IRK(身份解析密钥) | 手机系统蓝牙配置(非Carlink) | 跟随系统蓝牙清除 |
五、验证SDK主导性的实验
1. 强制清除SDK缓存
-
操作:
adb shell pm clear com.carlink
-
预期结果:
二次连接会要求重新输入PIN码,因为设备证书和公钥被清除。
2. 对比传统蓝牙行为
-
实验组:
清除系统蓝牙配对(设置→蓝牙→忘记设备
)。 -
对照组:
仅清除Carlink App数据。 -
结果:
-
实验组:Carlink仍可自动连接(依赖SDK缓存)。
-
对照组:需重新PIN码验证。
证明:鉴权完全由SDK控制,与系统蓝牙无关。
-
六、厂商适配建议
-
SDK必须实现的接口:
-
onFirstConnection(PIN)
: 处理首次PIN码输入。 -
onSessionKeyGenerated(key)
: 派生会话密钥。
-
-
协议栈配置要求:
- 禁用系统级配对(Android:
BluetoothDevice.EXTRA_PAIRING_VARIANT_NONE
)。
- 禁用系统级配对(Android:
通过此设计,Carlink在无协议栈参与的情况下,实现了与配对同等级的安全性,同时优化了用户体验。核心本质是:将安全逻辑从协议栈上移到应用层,通过SDK自主控制全流程。