在我们的日常使用的无线通信设备当中,都包含了MAC地址。MAC地址具有唯一性的特点,通常在网络通信当中,MAC地址作为设备符来采用。MAC地址大多是由设备的生产厂商来分配并且存储在设备当中。如果在网络当中有两个设备具有相同的MAC地址,那么就会产生网络通信的问题,所以设备的生产厂商在分配MAC地址的时候都非常小心,确保地址的唯一性。如果我们希望获取设备的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个字节。
公有地址的构成包含了两个部分,一部分是公司识别码(Company ID),其需要通过IEEE注册机构付费获得,公司识别码长度为24比特,处于48比特设备地址的高24比特;另外一部分是公司分配码(Company Assigned ID),其长度也为24比特,处于48比特设备地址的低24bit,如下图所示。
公有地址
除了公有地址,蓝牙设备也可以使用随机地址进行相关的网络操作。蓝牙的随机地址有包含两种:静态地址(Static Device Address)和私有地址(PrivateDevice Address)。由于静态地址和本文的主题—如何使用蓝牙4.2保护隐私关系不大,这里我们重点介绍一下私有地址。在私有地址的定义当中,又包含了两个子类:不可解析私有地址(Non-resolvable Private Address)和可解析私有地址(Resolvable Private Address, RPA)。所谓不可解析的私有地址,就是蓝牙设备地址在周期性的变化,并且这个地址无法被其他设备所解析,我们可以认为它就是一个随机数。不可解析的私有地址可以保护用户的隐私,因为不断变化的设备地址使得任何设备都无法通过记录蓝牙设备地址的方式来对用户进行跟踪,但这样的保护方式也意味着可信任的设备也无法这个蓝牙设备的真实身份,因此我们着重介绍可解析的私有地址。如下图所示,智能手机的设备地址在不断的变化,因此即便是设备地址被获取,也无法解析出设备的真实身份,除非具有某种解析密钥。
可解析的私有地址意味着蓝牙设备地址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交互的可信设备,才能对可解析随机地址进行解析。