北落不吉 2020-01-04
From
就像Ethernet MAC (Media Access Control)地址一样,每个蓝牙设备有一个基本标识符,即蓝牙设备地址,其是一个48位(6-byte)的唯一标识,蓝牙建立连接时使用的就是这个地址。
蓝牙有两类地址:
Public deviceaddress
Random device address
Public deviceaddress:相当于固定的BR / EDR,工厂编程的设备地址。它必须向IEEE注册机构注册,并且在设备的生命周期内不会变化。
蓝牙random地址又进一步分类如下:
对于一个蓝牙设备,可以使用public,static, resolvable 或者non-resolvable类型的蓝牙地址,地址类型通过广播包中的一个bit来区分,这个bit就是TxAddr和RxAddr。
Public address: 全球唯一性地址,前3个字节体现了OUI(Organizationallyunique identifier),表明制造商,定义如下
Static random address: 当OUI无法获取时,可以使用静态随机地址来替换Public address,定义如下:
Private addresses: 可以周期性的变化,因此可以避免设备被跟踪。这类地址又分为可以解析的地址和不可解析的私有地址。
Resolvable private address: 双方设备可以通过一个共享的key来解析的地址,BLE双方在经过配对以后,会产生一个用于解析私有地址的key,在后续的连接中,即使BLE设备地址发生了变化,也能被信任的设备识别,但对其他设备来说,则是随机变化和不可跟踪的,定义如下:
Non-resolvable privateaddress: 不可解析的地址,一般不希望使用这类型的地址,定义形式如下:
Resolvable private address的生成方法和解析方法
在蓝牙的pairing/bonding流程中,双方会产生交换两个参数(IPK,prand),其中IPK是地址解析用的密钥,prand是一个随机数,私有地址的解析会用到这两个参数以及一个哈希函数ah。
生成方法:
可以看到这类地址有两部分组成,24位的pand以及24位的hash值。因此,对方设备只要根据这个地址信息,使用相同的key就能解析出该地址:
上面公式中的prand是从对方地址中获取的,只要localhash与对方的hash值相同,就可以认为,这个设备是之前配对过可信的设备,从而实现双方设备的通信。