蓝牙地址也被称为蓝牙MAC地址,它能唯一标识一个蓝牙设备的48位的值。在蓝牙规范中,它被称为BD_ADDR
。蓝牙的地址类型可以分为两种:public addresses
和random addresses
,其中random addresses
又可再细分为几类,如下图所示:
1 Public Address
蓝牙的公有地址是一个全球的固定不变的48位扩展唯一标识符(EUI-48),它必须在IEEE注册,且遵循与MAC地址相同的规范。蓝牙公有地址的简化格式如下图所示:
Company ID(MSB)
:由IEEE公开分配的地址部分Company Assigned(LSB)
:公司内部分配的ID
2 Random Address
随机地址比公有地址使用更广泛,因为它们不需要在IEEE注册。随机地址又分为两类:Static Address
和Private Address
。
1、Static Address(静态地址)
静态地址不能再运行期间改变,它的格式如下(本文的地址格式图均为小端,故下图中Random为LSB):
其中46位的随机地址由开发者或者制造商来分配。
注意:所有的蓝牙设备必须使用Public Address
或者Random Static Address
其中一种,而接下来要介绍的Private Address
仅用于解决隐私问题。
2、Private Address(私有地址)
随机私有地址专门用于保护蓝牙设备的隐私,隐藏身份,防止设备被跟踪,它又分为:resolvable
(可解析)的和non-resolvable
不可解析的地址。
(1)resolvable
可解析的随机私有地址的目的是防止恶意第三方跟踪蓝牙设备,同时允许一个或多个受信任方识别目标蓝牙设备。它的原理是与信任的设备共享一个密钥,这个密钥称为IRK
(Identity Resolving Key
),可解析的私有随机地址就是采用IRK
和一个随机数生成的。
在这种情况下,一个可信任的设备称为bonded device
(绑定设备),绑定是两个蓝牙连接后的一个可选功能。比如手机连接过一个蓝牙手环,那么断开蓝牙连接后,该设备还会出现在手机的蓝牙列表中,这就是绑定,这样在下次连接的时候就能非常快地配对。这种类型的地址定期变化,根据蓝牙规范的建议是每15分钟更换一次。它的格式如下:
random part of prand
:随机产生的hash
:hash值是使用prand
和IRK
生成的- 通过随机生成的
prand
和IRK
计算出hash
之后,组合成了可解析的私有地址。
(2)Non-Resolvable
这种地址的唯一目的是防止被其他BLE设备监听。它的地址也会周期性地改变,与可解析地址的不同是,它不能被任何其他设备解析。这种地址不是很常用,但是有时会在Bluetooth beacon
中使用。它的格式如下:
3 BLE设备的隐私
如果不采取适当的措施,蓝牙的地址可用于跟踪用户的数据。蓝牙设备的隐私是通过使用resolvable private address
(可解析的私有地址)来实现的。在之前的配对过程中对端设备可能已经收到了IRK
,以后再建立连接,对端设备在收到了对方广播报文中的resolvable random address
后,将其的prand
字段提取出来与本地的IRK
计算得到一个hash
值,与地址中的hash
字段做对比,若相同,才进行后续操作。
IRK
用于生成和解析resolvable private address
IRK
可由每个设备本地生成、随机生成或在生产过程中分配- 在
bond
过程中,每个设备将其对端设备的IRK
存储在它自己的resolving list
(解析列表)中