别再死记硬背了!用一张图+代码示例,彻底搞懂蓝牙BLE配对的6种SMP流程
蓝牙BLE安全配对实战图解6种SMP流程与核心算法拆解每次看到蓝牙协议栈里那些晦涩的安全管理协议SMP文档就头疼别担心今天我们用工程师的思维来重新解构这个安全黑匣子。扔掉那些让人昏昏欲睡的文字说明我将带您用一张决策树状图和可运行的代码示例把BLE配对的6种SMP流程变成可视化的技术拼图。1. SMP协议的本质安全握手的三重奏想象两个陌生人在嘈杂的咖啡馆交换机密文件。他们需要1确认对方身份 2建立加密通道 3安全传输内容——这正是SMP协议的三个核心阶段。在BLE世界里这个流程被标准化为能力协商阶段设备间交换安全参数就像出示身份证密钥生成阶段通过密码学舞蹈产生临时或长期密钥相当于约定加密规则密钥分发阶段在加密通道中传递身份识别等敏感信息实际文件传递# 简化的SMP状态机伪代码示例 class SMPStateMachine: def __init__(self): self.state IDLE def handle_event(self, pdu): if self.state IDLE and pdu PAIRING_REQUEST: self.start_pairing() elif self.state FEATURE_EXCHANGE: self.negotiate_algorithm(pdu.io_capabilities) # 其他状态处理... def start_pairing(self): print(启动30秒超时计时器) self.timer threading.Timer(30.0, self.timeout_handler) self.timer.start()关键提示所有SMP交互都在固定的L2CAP信道0x0006上进行MTU大小取决于是否支持LE Secure Connections65字节 vs 23字节2. 配对流程决策树六种路径全景图决定SMP走向的三个关键参数安全连接支持LE Legacy Pairing 或 LE Secure ConnectionsIO能力键盘/显示屏/两者皆无OOB支持是否使用带外认证这些参数的组合形成了著名的六种配对方式配对类型适用场景安全等级典型用例Just Works无输入输出设备★☆☆☆☆蓝牙遥控器配对电视Passkey Entry一方有键盘一方有显示屏★★★☆☆手机配对智能锁OOB支持NFC等近场通信★★★★☆高端耳机快速配对Numeric Comparison双方都有显示屏★★★★★两个手机互相认证Passkey Entry (SC)安全连接下的密码输入★★★★★医疗设备安全配对OOB (SC)安全连接下的带外认证★★★★★企业级IoT设备部署graph TD A[开始配对] -- B{支持LE Secure Connections?} B --|是| C[LE Secure Connections] B --|否| D[LE Legacy Pairing] C -- E{IO能力与OOB} D -- F{IO能力与OOB} E --|双方显示| G[Numeric Comparison] E --|一方输入一方显示| H[Passkey Entry SC] E --|OOB可用| I[OOB SC] F --|无输入输出| J[Just Works] F --|一方输入一方显示| K[Passkey Entry] F --|OOB可用| L[OOB]3. 密码学引擎室核心算法函数详解3.1 Legacy Pairing的加密工具箱在传统配对中这几个函数扮演着关键角色c1函数用于生成确认值def c1(k, r, preq, pres, iat, rat, ia, ra): p1 preq pres bytes([iat]) bytes([rat]) ia ra p2 ia ra bytes([rat]) bytes([iat]) pres preq temp xor_128(r, p1) return aes_128(k, aes_128(k, temp) ^ p2)s1函数生成短期密钥STKdef s1(k, r1, r2): # 拼接r1的高64位和r2的低64位 r_combined (r1 0xFFFFFFFFFFFFFFFF0000000000000000) | (r2 0x0000000000000000FFFFFFFFFFFFFFFF) return aes_128(k, r_combined)技术细节Just Works模式下TK0Passkey Entry模式下TK是6位数字000000-999999OOB模式下TK是预共享的128位随机数3.2 Secure Connections的升级装备安全连接引入了更强大的椭圆曲线密码学P-256曲线和这些新武器f4函数用于配对确认def f4(u, v, x, z): message u v z return aes_cmac(x, message)f5函数生成LTK和MacKeydef f5(dhkey, n1, n2, a1, a2): t aes_cmac(bsalt, dhkey) # salt是固定值蓝牙SMP part1 aes_cmac(t, b\x00 bbtle n1 n2 a1 a2 b\x00\x01\x00) part2 aes_cmac(t, b\x01 bbtle n1 n2 a1 a2 b\x00\x01\x00) return part1, part2 # MacKey, LTK4. 实战案例从协议到代码的完整映射让我们以最常见的Just Works配对为例看看协议栈中实际发生了什么特征交换# Master发送Pairing Request pairing_req { io_cap: IO_CAP_NO_INPUT_NO_OUTPUT, oob_flag: OOB_AUTH_NOT_PRESENT, auth_req: AUTH_REQ_BONDING } # Slave回复Pairing Response pairing_res { io_cap: IO_CAP_NO_INPUT_NO_OUTPUT, oob_flag: OOB_AUTH_NOT_PRESENT, auth_req: AUTH_REQ_BONDING }认证阶段TK0# 双方计算并交换Confirm值 m_confirm c1(tk0, m_randos.urandom(16), preqpairing_req_bytes, prespairing_res_bytes, iat0, rat0, iamaster_addr, raslave_addr) # 交换随机数后验证 if local_confirm ! peer_confirm: raise SMPAuthenticationError(Confirm值不匹配)密钥生成# 生成STK用于加密链路 stk s1(tk0, s_randslave_rand, m_randmaster_rand) # 后续在加密通道中交换LTK等长期密钥 ltk generate_ltk() # 通常使用硬件随机数生成器在开发中遇到的经典问题Confirm值校验失败检查地址类型0公共地址1随机地址和字节序问题STK生成失败确认随机数是否正确传递和拼接。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2475017.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!