天天看點

藍牙協定分析(6)_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。它們的關系如下所示:

藍牙協定分析(6)_BLE位址類型

3. Public Device Address

在通信系統中,裝置位址是用來唯一識别一個實體裝置的,如TCP/IP網絡中的MAC位址、傳統藍牙中的藍牙位址等。對裝置位址而言,一個重要的特性,就是唯一性(或者說一定範圍内的唯一),否則很有可能造成很多問題。藍牙通信系統也不例外。

對經典藍牙(BR/EDR)來說,其裝置位址是一個48bits的數字,稱作"48-bit universal LAN MAC addresses(和電腦的MAC位址一樣)“。正常情況下,該位址需要向IEEE申請(其實是購買[1],呵呵!)。企業交錢,IEEE保證位址的唯一性,皆大歡喜。

當然,這種位址配置設定方式,在BLE中也保留下來了,就是Public Device Address。Public Device Address由24-bit的company_id和24-bit的company_assigned組成,具體可參考藍牙Spec中相關的說明[2]。

  1. Random Device Address

    但是,在BLE時代,隻有Public Device Address還不夠,有如下原因:

1)Public Device Address需要向IEEE購買。雖然不貴,但在BLE時代,相比BLE IC的成本,還是不小的一筆開銷。

2)Public Device Address的申請與管理是相當繁瑣、複雜的一件事情,再加上BLE裝置的數量衆多(和傳統藍牙裝置不是一個數量級的),導緻維護成本增大。

3)安全因素。BLE很大一部分的應用場景是廣播通信,這意味着隻要知道裝置的位址,就可以擷取所有的資訊,這是不安全的。是以固定的裝置位址,加大了資訊洩漏的風險。

為了解決上述問題,BLE協定新增了一種位址:Random Device Address,即裝置位址不是固定配置設定的,而是在裝置裝置啟動後随機生成的。根據不同的目的,Random Device Address分為Static Device Address和Private Device Address兩類。

4.1 Static Device Address

Static Device Address是裝置在上電時随機生成的位址,格式如下:

LSB MSB

±-----------------------------------±–±--+

| Random part of static address | 1 | 1 |

±-----------------------------------±–±--+

static address

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

Static Device Address的特征可總結為:

1)最高兩個bit為“11”。

2)剩餘的46bits是一個随機數,不能全部為0,也不能全部為1。

3)在一個上電周期内保持不變。

4)下一次上電的時候可以改變。但不是強制的,是以也可以保持不變。如果改變,上次儲存的連接配接等資訊,将不再有效。

Static Device Address的使用場景可總結為:

1)46bits的随機數,可以很好地解決“裝置位址唯一性”的問題,因為兩個位址相同的機率很小。

2)位址随機生成,可以解決Public Device Address申請所帶來的費用和維護問題。

4.2 Private Device Address

Static Device Address通過位址随機生成的方式,解決了部分問題,Private Device Address則更進一步,通過定時更新和位址加密兩種方法,提高藍牙位址的可靠性和安全性。根據位址是否加密,Private Device Address又分為兩類,Non-resolvable private address和Resolvable private address。下面我們分别描述。

4.2.1 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) ±-------------->

特征可總結為:

1)最高兩個bit為“00”。

2)剩餘的46bits是一個随機數,不能全部為0,也不能全部為1。

3)以T_GAP(private_addr_int)為周期,定時更新。

注1:Non-resolvable private address有點奇怪,其應用場景并不是很清晰。位址變來變去的,确實是迷惑了敵人,但自己人不也一樣被迷惑了嗎?是以,實際産品中,該位址類型并不常用。

4.2.2 Resolvable private address

Resolvable private address比較有用,它通過一個随機數和一個稱作identity resolving key (IRK) 的密碼生成,是以隻能被擁有相同IRK的裝置掃描到,可以防止被未知裝置掃描和追蹤。其格式如下:

LSB MSB

±-------------------------±---------------------±–±--+

| | Random part of prand | 1 | 0 |

±-------------------------±---------------------±–±--+

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

(24 bits) (24 bits)

特征如下:

1)由兩部分組成:

高位24bits是随機數部分,其中最高兩個bit為“10”,用于辨別位址類型;

低位24bits是随機數和IRK經過hash運算得到的hash值,運算的公式為hash = ah(IRK, prand)。

2)當對端BLE裝置掃描到該類型的藍牙位址後,會使用儲存在本機的IRK,和該位址中的prand,進行同樣的hash運算,并将運算結果和位址中的hash字段比較,相同的時候,才進行後續的操作。這個過程稱作resolve(解析),這也是Non-resolvable private address/Resolvable private address命名的由來。

3)以T_GAP(private_addr_int)為周期,定時更新。哪怕在廣播、掃描、已連接配接等過程中,也可能改變。

4)Resolvable private address不能單獨使用,是以需要使用該類型的位址的話,裝置要同時具備Public Device Address或者Static Device Address中的一種。

  1. 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中,需要指定的參數包括:需要添加裝置的位址(包括位址類型)、需要添加裝置的IRK、本裝置的IRK。

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,禁止/使能位址解析功能。

總結和說明:

1)Resolvable private address的生成,是Host以T_GAP(private_addr_int)為周期,主動進行的,并通過“LE Set Random Address Command”告知Controller的Link Layer。是以,如果本地裝置需要安全的環境,可以使用Resolvable private address作為廣播和連接配接位址。

2)如果本地裝置需要和某一個使用Resolvable private address的裝置通信(掃描、連接配接等),則需要将該裝置添加到Resolving List中,并使能位址解析功能。隻有位址解析正确的時候,Link Layer才會繼續後續的通信動作。

3)如果位址解析不正确,本地裝置向對方發送的所有的資料包(掃描請求、連接配接請求等),都不能被正确接收(因為目的位址不正确)。但有一個例外,如果本地裝置直接關閉位址解析功能,還是能收到對方的廣播包,是以,Resolvable private address并不能保護廣播包的資料。如果有敏感資訊,放到scan response packet中應該是一個不錯的選擇。

4)上面分析是否正确?我也不是十分有把握,後續可以做個實驗看看。

轉自:蝸窩科技,www.wowotech.net