藍芽協議分析(6)_BLE地址型別
-
前言
也許關注BLE的同學都注意到了,BLE裝置有多種型別的裝置地址,如Public Device Address、Random Device Address、Static Device Address、Private Device Address等等。如果不瞭解內情,大家肯定會被它們繞暈。不過存在即合理,這樣看似奇怪的設計,實際上反映了BLE的設計思路以及所針對的應用場景。讓我們通過本文一窺究竟。 -
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。它們的關係如下所示:
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]。
- 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中的一種。
- 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