如果我们希望获取设备的MAC地址也非常的简单,当我们打开智能手机或者是平板电脑,您可以非常简单的在类似于“设备管理”的界面找到设备的MAC地址,而有些设备,比如说无线路由器,它们的MAC地址就打印在设备的背面。同时,我们还可以通过其他的方式来获取设备的MAC地址。
我们可以试想一下,当我们每天搭乘公共交通穿行了整个城市,当我们在商场购物或是和朋友在餐厅聚餐的时候,你的智能手机可以帮助你付费、点单和导航。如果你的智能手机接入到网络热点当中进行互联网访问的时候,它就可能会在这一系列的过程当中来广播其MAC地址。
我们前面提到了MAC地址在网络通信当中的唯一性,你又是智能手机的使用者,那么这部智能手机的MAC地址从某一角度来讲,就代表了你在无线通信过程当中的身份认证。因此就存在这样一种可能,一些怀有恶意的人通过一些其他的无线通信设备,可以获取你的智能手机进行数据交互时的MAC地址并且记录了MAC地址出现的日期、时间和相关的位置,那么你的行踪就可以被监控,如下图所示:
使用蓝牙技术,也可能面对上面的这种问题。因此在蓝牙4.2核心规范当中,对上述问题提出了一种解决方法。要了解这个解决的方法,首先要现从蓝牙设备的地址说起。和其他的无线通信技术类似,蓝牙设备也有自身的设备地址,我们在蓝牙的核心规范当中,通常称其为BD_ADDR(Bluetooth Device Address),BD_ADDR将会在蓝牙设备诸如连接和配对的过程当中起到设备识别的作用。
对于蓝牙设备,可以使用公有地址(Public Device Address),也可以使用随机地址(Random Device Address),但无论是使用公有地址,还是随机地址,它们的地址长度都是48比特,也就是6个字节。
二、公有地址(Public Device Address)
公有地址的构成包含了两个部分,一部分是公司识别码(Company ID),其需要通过IEEE注册机构付费获得,公司识别码长度为24比特,处于48比特设备地址的高24比特;另外一部分是公司分配码(Company Assigned ID),其长度也为24比特,处于48比特设备地址的低24bit,如下图所示。
- Company ID(MSB):由IEEE公开分配的地址部分
- Company Assigned(LSB):公司内部分配的ID
除了公有地址,蓝牙设备也可以使用随机地址进行相关的网络操作。
三、随机地址(Random Device Address)
蓝牙的随机地址有包含两种:静态地址(Static Device Address)和私有地址(PrivateDevice Address)。
3.1、静态地址(Static Device Address)
静态地址(Static Device Address)不能再运行期间改变,它的格式如下(本文的地址格式图均为小端,故下图中Random为LSB):
其中46位的随机地址由开发者或者制造商来分配。
注意:所有的蓝牙设备必须使用Public Address或者Random Static Address其中一种,而接下来要介绍的Private Address仅用于解决隐私问题。
3.2、 私有地址 ( PrivateDevice Address ) ****
在私有地址的定义当中,又包含了两个子类:不可解析私有地址(Non-resolvable Private Address)和可解析私有地址(Resolvable Private Address, RPA)。所谓不可解析的私有地址,就是蓝牙设备地址在周期性的变化,并且这个地址无法被其他设备所解析,我们可以认为它就是一个随机数。
A、可解析私有地址(Resolvable Private Address)
可解析的随机私有地址的目的是防止恶意第三方跟踪蓝牙设备,同时允许一个或多个受信任方识别目标蓝牙设备。它的原理是与信任的设备共享一个密钥,这个密钥称为IRK(Identity Resolving Key),可解析的私有随机地址就是采用IRK和一个随机数生成的。
在这种情况下,一个可信任的设备称为bonded device(绑定设备),绑定是两个蓝牙连接后的一个可选功能。比如手机连接过一个蓝牙手环,那么断开蓝牙连接后,该设备还会出现在手机的蓝牙列表中,这就是绑定,这样在下次连接的时候就能非常快地配对。这种类型的地址定期变化,根据蓝牙规范的建议是每15分钟更换一次。它的格式如下:
- random part of prand:随机产生的
- hash:hash值是使用prand和IRK生成的
- 通过随机生成的prand和IRK计算出hash之后,组合成了可解析的私有地址。
可解析的私有地址意味着蓝牙设备地址BD_ADDR在周期性的不断变化,可以保护用户的隐私不被跟踪;同时由于其是可解析的,因此配对设备(Pair Device)可以通过这个私有地址解析出蓝牙设备的真实身份。因此,我们要了解可解析的私有地址是如何产生的?
假设有两个蓝牙设备,分别是设备A和设备B,在两个蓝牙设备A、B建立连接之后,这两个蓝牙设备可以通过配对的方式交换各自的身份解析密钥IRK(Identity Resolving Key, IRK),设备A的身份解析密钥IRK-A,设备B的身份解析密钥IRK-B。假设设备B采用了可解析的私有地址机制,那么设备B就需要周期性的产生可解析的私有地址。下图是可解析随机地址的结构,其中可解析随机地址的高两个比特分别为0和1,作为可解析地址的标识符。
当设备B需要生成随机地址的时候,其内部会首先生成一个随机数prand,基于prand随机数,设备B需要利用哈希hash算法生成可解析随机地址的另外一部分,hash。prand随机数和哈希hash分别占用24比特,计算公式为:
哈希hash = ah(IRK-B, prand随机数)
其中函数ah在蓝牙4.2核心规范第3卷H部分2.2.2章节有详细介绍,此处不再赘述。当设备B具有了prand随机数和基于prand随机数生成的哈希hash之后,通过移位相与的方式,就可以生成可解析随机地址RPA。
RPA= hash || prand
那么设备A该如何解析RPA呢?当设备A收到一个蓝牙设备地址BD_ADDR,并且这个地址的地址标识符表明其是一个可解析随机地址,设备A首先将这个地址拆分为prand随机数和哈希hash。接下来其利用之前与设备B配对时获取的IRK-B,通过函数ah来生成一个本地哈希localHash。
localHash = ah(IRK-B, prand)
如果生成的本地哈希localHash与拆分得到的哈希hash相等,说明这个地址是设备B所产生的可解析随机地址;如果不等,代表解析失败。设备A可以利用其获取的其他设备的IRK对这个地址就行解析。下图是一个地址解析的流程图。
地址解析流程
因此,对于可解析随机地址的解析,我们可以认为它是一个穷举的过程。任何设备在收到一个可解析随机地址的时候,都会利用其本地所存储的所有IRK对这个可解析随机地址进行哈希比对,如果相符,解析过程终止,这个地址的真实身份可解析;如果所有的IRK都无法对这个地址进行解析,那么解析失败。
通过上述的方法,蓝牙设备可以通过采用可解析随机地址的方式来对设备隐私进行保护,进而对设备使用者的隐私进行保护。采用了可解析随机地址之后,蓝牙设备的地址是周期性不断变化的,所以即使通过其他方式获取了蓝牙设备的地址,也无法通过设备地址出现的时间和地址来对设备进行跟踪。只有那些经过配对过程完成了身份解析密钥IRK交互的可信设备,才能对可解析随机地址进行解析。
B、不可解析私有地址(Non-resolvable Private Address)
不可解析的私有地址可以保护用户的隐私,因为不断变化的设备地址使得任何设备都无法通过记录蓝牙设备地址的方式来对用户进行跟踪,但这样的保护方式也意味着可信任的设备也无法这个蓝牙设备的真实身份,因此我们着重介绍可解析的私有地址。如下图所示,智能手机的设备地址在不断的变化,因此即便是设备地址被获取,也无法解析出设备的真实身份,除非具有某种解析密钥。
这种地址的唯一目的是防止被其他BLE设备监听。它的地址也会周期性地改变,与可解析地址的不同是,它不能被任何其他设备解析。这种地址不是很常用,但是有时会在Bluetooth beacon中使用。它的格式如下:
四、BLE设备的隐私
如果不采取适当的措施,蓝牙的地址可用于跟踪用户的数据。蓝牙设备的隐私是通过使用resolvable private address(可解析的私有地址)来实现的。在之前的配对过程中对端设备可能已经收到了IRK,以后再建立连接,对端设备在收到了对方广播报文中的resolvable random address后,将其的prand字段提取出来与本地的IRK计算得到一个hash值,与地址中的hash字段做对比,若相同,才进行后续操作。
- IRK用于生成和解析resolvable private address
- IRK可由每个设备本地生成、随机生成或在生产过程中分配
- 在bond过程中,每个设备将其对端设备的IRK存储在它自己的resolving list(解析列表)中