蓝牙 BLE 地址类型解析

1. 前言

也许关注 BLE 的同学都注意到了,BLE 设备有多种类型的设备地址,如 Public Device Address,Random Device Address,Static Device Address,Private Device Address。如果不了解内情,大家肯定会被它们绕晕。不过存在即合理,这样看似奇怪的设计,实际上反映了 BLE 的设计思路以及所针对的应用场景。让我们通过本文一窥究竟。

2. BLE设备的地址类型

一个 BLE 设备,可以使用两种类型的地址(一个 BLE 设备可同时具备两种地址):Public Device Address 和 Random Device Address。而 Random Device Address 又分为 Static Device Address 和 Private Device Address 两类。其中 Private Device Address 又可以分为 Non-resolvable Private Address 和 Resolvable Private Address。它们的关系如下所示:


+--> Public Device Address 

+-------------+  | 

|             |  | 

|     BLE     |  | 

|    Device   +--+    or/and 

|             |  |                             +--> Static Device Address 

+-------------+  |                             | 

|                             | 

+--> Random Device Address +--+    or                        +-> Non-resolvable private address 

                                               |                              |

|                              | 

+--> Private Device Address +--+   or 

+-> Resolvable private address 


Public Device Address


在通信系统中,设备地址是用来唯一识别一个物理设备的,如 TCP/IP 网络中的 MAC 地址、传统蓝牙中的蓝牙地址等。对设备地址而言,一个重要的特性,就是唯一性(或者说一定范围内的唯一),否则很有可能造成很多问题。蓝牙通信系统也不例外。对经典蓝牙(BR/EDR)来说,其设备地址是一个 48bits 的数字,称作"48-bit universal LAN MAC addresses“(和电脑的 MAC 地址一样)。正常情况下,该地址需要向 IEEE 申请(其实是购买,呵呵)。企业交钱,IEEE 保证地址的唯一性,皆大欢喜。当然,这种地址分配方式,在 BLE 中也保留下来了,就是 Public Device Address。Public Device Address 由 24-bit 的 company_id 和 24-bit 的 company_assigned 组成,具体可参考蓝牙 Spec 中相关的说明。



Random Device Address


但是,在 BLE 时代,只有 Public Device Address 还不够,有如下原因:

Public Device Address 需要向 IEEE 购买。虽然不贵,但在 BLE 时代,相比 BLE IC 的成本,还是不小的一笔开销。

Public Device Address 的申请与管理是相当繁琐、复杂的一件事情,再加上 BLE 设备的数量众多(和传统蓝牙设备不是一个数量级的),导致维护成本增大。

安全因素。BLE 很大一部分的应用场景是广播通信,这意味着只要知道设备的地址,就可以获取所有的信息,这是不安全的。因此固定的设备地址,加大了信息泄漏的风险。

为了解决上述问题,BLE 协议新增了一种地址:Random Device Address,即设备地址不是固定分配的,而是在设备设备启动后随机生成的。根据不同的目的,Random Device Address 分为 Static Device Address 和 Private Device Address 两类。

Static Device Address

Static Device Address是设备在上电时随机生成的地址,格式如下:

LSB                                        MSB 

+------------------------------------+---+---+ 

|    Random part of static address   | 1 | 1 | 

+------------------------------------+---+---+ 

static address 

<--------------+  (48 bits)  +---------------> 


Static Device Address 的特征可总结为:

最高两个 bit 为“11”。

剩余的 46bits 是一个随机数,不能全部为 0,也不能全部为 1。

在一个上电周期内保持不变。

下一次上电的时候可以改变。但不是强制的,因此也可以保持不变。如果改变,上次保存的连接等信息,将不再有效。

Static Device Address 的使用场景可总结为:

46bits 的随机数,可以很好地解决“设备地址唯一性”的问题,因为两个地址相同的概率很小。

地址随机生成,可以解决 Public Device Address 申请所带来的费用和维护问题。

Private Device Address

Static Device Address 通过地址随机生成的方式,解决了部分问题,Private Device Address 则更进一步,通过定时更新和地址加密两种方法,提高蓝牙地址的可靠性和安全性。根据地址是否加密,Private Device Address 又分为两类,Non-resolvable private address 和 Resolvable private address。下面我们分别描述。

Non-resolvable private address

Non-resolvable private address 和 Static Device Address 类似,不同之处在于,Non-resolvable private address 会定时更新。更新的周期称是由 GAP 规定的,称作 T_GAP(private_addr_int) ,建议值是 15 分钟。其格式如下:

LSB                                        MSB 

+----------------------------------------+---+ 

|Random part of nonresolvable address| 0 | 0 | 

+----------------------------------------+---+ 

nonresolvable address 

<--------------+  (48 bits)  +---------------> 

特征可总结为:

最高两个 bit 为“00”。

剩余的 46bits 是一个随机数,不能全部为 0,也不能全部为 1。

以 T_GAP(private_addr_int) 为周期,定时更新。

注1:Non-resolvable private address 有点奇怪,其应用场景并不是很清晰。地址变来变去的,确实是迷惑了敌人,但自己人不也一样被迷惑了吗?因此,实际产品中,该地址类型并不常用。

Resolvable private address

Resolvable private address 比较有用,它通过一个随机数和一个称作 Identity Resolving Key (IRK) 的密码生成,因此只能被拥有相同 IPK 的设备扫描到,可以防止被未知设备扫描和追踪。其格式如下:

LSB                                                     MSB 

+--------------------------+----------------------+---+---+ 

|                          | Random part of prand | 1 | 0 | 

+--------------------------+----------------------+---+---+ 


<--------+ hash +---------> <-----------+ prand +-------> 

(24 bits)                     (24 bits) 

特征如下:

由两部分组成: 高位 24bits 是随机数部分,其中最高两个 bit 为“10”,用于标识地址类型; 低位 24bits 是随机数和 IRK 经过 hash 运算得到的 hash 值,运算的公式为 hash = ah(IRK, prand)。

当对端 BLE 设备扫描到该类型的蓝牙地址后,会使用保存在本机的 IRK,和该地址中的 prand,进行同样的 hash 运算,并将运算结果和地址中的 hash 字段比较,相同的时候,才进行后续的操作。这个过程称作 resolve(解析),这也是 Non-resolvable private address/Resolvable private address 命名的由来。

以 T_GAP(private_addr_int) 为周期,定时更新。哪怕在广播、扫描、已连接等过程中,也可能改变。

Resolvable private address 不能单独使用,因此需要使用该类型的地址的话,设备要同时具备 Public Device Address 或者 Static Device Address 中的一种。


Resolvable private address 应用场景及 HCI 命令介绍:

BLE Resolvable private address 的解析和过滤操作是在 Link Layer 实现的,因而为 BLE 的广播通信提供了一个相对安全的加密环境。Link Layer 以 Resolving List 的形式,通过 HCI 向 Host 提供相关的控制 API,以实现相应的功能,相关的 HCI 命令介绍如下:

LE Set Random Address Command,设置一个新的Random地址,包括Resolvable private address类型的地址。

LE Add Device to Resolving List Command,将指定的设备添加到本机的Resolving List中,需要指定的参数包括:需要添加设备的地址(包括地址类型)、需要添加设备的IPK、本设备的IPK。

LE Remove Device From Resolving List Command,将指定设备从本机的Resolving List中删除。

LE Clear Resolving List Command,清除本机的Resolving List。

LE Read Resolving List Size Command,读取本机Resolving List的大小。

LE Read Peer Resolvable Address Command,读取对端设备解析后的Resolvable private address。

LE Read Local Resolvable Address Command,读取本机设备解析后的Resolvable private address。

LE Set Address Resolution Enable Command,禁止/使能地址解析功能。

总结和说明

Resolvable private address 的生成,是 Host 以 T_GAP(private_addr_int) 为周期,主动进行的,并通过“LE Set Random Address Command”告知 Controller 的 Link Layer。因此,如果本地设备需要安全的环境,可以使用 Resolvable private address 作为广播和连接地址。

如果本地设备需要和某一个使用 Resolvable private address 的设备通信(扫描、连接等),则需要将该设备添加到 Resolving List 中,并使能地址解析功能。只有地址解析正确的时候,Link Layer 才会继续后续的通信动作。

如果地址解析不正确,本地设备向对方发送的所有的数据包(扫描请求、连接请求等),都不能被正确接收(因为目的地址不正确)。但有一个例外,如果本地设备直接关闭地址解析功能,还是能收到对方的广播包,因此,Resolvable private address 并不能保护广播包的数据。如果有敏感信息,放到 scan response packet 中应该是一个不错的选择。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • 最近项目需求要做蓝牙自动配对,也就是在首次配对的时候跳过用户输入PIN码。网上有很多分享的如何实现自动配对。以下做...
    Mr_Tu阅读 12,491评论 2 7
  • 安卓4.3(API 18)为BLE的核心功能提供平台支持和API,App可以利用它来发现设备、查询服务和读写特性。...
    风雨byt阅读 14,014评论 3 43
  • 今天再读《爱表扬》课程,心里又多了一些感悟、体会。回顾三个月的亮点记录及入群一个多月的学习经历,感触良多。刚...
    xj兰草阅读 266评论 4 6
  • 想写这篇文字很久了,感触源于阿根廷和西班牙合作的电影《荒蛮故事》。120分钟的电影由六个既反叛又娱乐的复仇小故事组...
    Super_Hellen阅读 554评论 0 3