淺析 Find My 原理
什麼是 Find My 網路?
2021年4月21日的蘋果發布會發布了一款新的產品:AirTag。使用的是 BLE + UWB 的技術。BLE 和 Find My 網路為 AirTag 提供了 GPS 定位,UWB 進一步提供了厘米級別的定位精度 。二者相互補充,實為用戶提供極致的物品防丟體驗。AirTag 外觀如下圖所示:
Find My 是蘋果公司發布的一項應用技術。這項技術比較神奇的一點是,支援這項技術的外設產品(如 AirTag),即使本身沒有 GPS 模組,也能利用它周圍的蘋果設備(iPhone,iPad,AirPods,AirTag等)來幫助其定位。
其實三星早在21年1月份就發布了類似的產品(SmartTags),但三星的生態沒有蘋果的強大,使用體驗上有所欠缺(無法全球定位)所以發布了之後不慍不火。
使用 iPhone 打開 Find My APP,就可以從地圖上看到我所擁有的、所有被 Find My 網路偵測到的設備。APP 介面如下圖:
讓外設加入 Find My 網路
入網要求
非蘋果生產的外設能否併入查我網路呢?答案是可以的:
蘋果為其它想併入查我網路的外設生產商提供了技術規格,規格書如下:
📎Find_My_Network_Accessory_Specification__Developer_Preview_R3.pdf
從規格書中,我們可以詳細了解到查我網路的原理、工作流程以及和外設相關技術標準。
github 資源
有一點比較麻煩的是,想併入Find My的設備的生產廠商,必須過 MFi 認證。github 上有人通過一些反向工程的方法,成功從蘋果的伺服器上拿到了自己的 BLE 外設的定位數據,鏈接如下:
//github.com/seemoo-lab/openhaystack#how-to-track-other-bluetooth-devices
但這個的實用意義並不大。簡單來說,它的工作流程是這樣的:
- 作者在它的蘋果電腦上生成了一對密鑰對。把其中的 public key 通過有線的方式給到 BLE 外設
- BLE 外設按照 Find My 規格中關於 beacon 數據的格式,把 public key 不斷的向周圍廣播出去
- 周圍的蘋果設備把這個 public key 結合自身的定位數據,發送到蘋果伺服器
- 作者的蘋果電腦、通過一個 mail 插件,把伺服器上的定位數據拿下來,顯示在地圖上。
可見,作者並不是從蘋果的 Find My APP 上顯示的設備定位,而是通過自己的 mail 插件來顯示,並且需要一系列的部署來繞過蘋果的門禁機制,實用意義不大。
第三方 Find My 外設
目前,已經有幾家第三方公司的產品支援了 Find My 網路,包括:
開發 Find My 外設
想開發 Find My 外設的廠商、必須先拿到 MFi 認證。
具體的說,過了 MFi 認證的廠商,才能進一步拿到以下文檔:
- Works with Apple Find My Identity Guidelines
- Software Authentication Server Specification
- Unified Accessory Restore Protocol
在過 MFi 認證之前,蘋果也發布了一份規格書,闡述了 Find My 的一些原理和流程,並且詳細描述了構建一個 FindMy 外設所需的 BLE 服務。但也僅限於此,其中關於如何標識、加密、驗證、OTA 的相關流程,需要過了 MFi 認證之後,拿到上述幾個文檔才能進一步了解。
這份文檔目前(2021/04/20)貌似找不到了。幸虧我下手快,備份了下來:
📎Find_My_Network_Accessory_Specification__Developer_Preview_R3.pdf
Find My 網路核心概念
本章節提及的概念,不包含整個完整的 Find My 網路的技術範圍,僅限定在 Find My 網路外設相關的技術範圍內。
Find My app
即用戶使用 Find My 網路這個功能的軟體。iOS 13 之後,是一個默認的應用。可在 iPad 或 iPhone 上直接打開。打開後的介面如文章開頭所示。
這個 app 包含以下功能:
- 和朋友、家人分享你的定位
- 在地圖上顯示你的、可被查找的設備
- 讓特定設備播放聲音、格式化等
- 添加新的設備
Transport
傳輸方式。Find My 網路外設使用 BLE 作為首要的傳輸技術、和蘋果設備進行交互
Operation
工作流程。如下:
- 使用 Find My app 和一個 Find My 外設連接之後,他們之間就協商出了一對秘鑰對。Find My app 保存著私鑰和公鑰;外設保存著公鑰。
- 外設作為 BLE beacon,不斷廣播一個變化的秘鑰(由公鑰衍生而得)
- 周圍的蘋果設備(iPad,iPhone 等,可以是其他人的設備)檢測到這個廣播後,會把裡面的秘鑰結合自身的定位數據,打包上傳蘋果伺服器
- Find My app 從伺服器上拿到這些定位報告,將相關的定位數據解析出來
其中,和定位相關的數據是端對端加、解密的,蘋果伺服器無法得知。我的理解是,由周圍的蘋果設備加密(定位數據 + 公鑰),再由 app 解密(定位數據 + 私鑰)。蘋果伺服器只負責存儲、傳輸。
Roles
角色。包含以下幾種:
Owner device
擁有者設備。你的蘋果設備,自然是用你的 Apple ID 進行激活、登錄的,把外設和你的蘋果設備連接過後(通過 Find My app),這個外設便被綁上了你的 Apple ID。成為 Find My network 的「擁有者設備」角色。當外設通過 Find My app 和某個蘋果設備進行連接配對之後,外設便和 Apple ID 進行了關聯。具有相同 Apple ID 的蘋果設備、外設,便叫。
Accessory
實現了 Find My network 協議的外設。
Find My network
當你帶著一個支援 Find My 協議的防丟器上街,你所處的環境里,周圍人的 iPad、iPhone 等蘋果設備(使能了 Find My 功能)構成了一張網路。你的防丟器本身不帶 GPS 無法定位,但這張網路中的設備可以提供自己的 GPS 數據、和你的防丟器的 Apple ID 進行關聯後,上傳到蘋果的伺服器。
網路中具備掃描廣播功能的蘋果設備,稱為發現者(finder),發現者越多,外設的定位越精準。
有一點需要注意的是,別人的蘋果設備也能連上你的防丟器,用於給你的防丟器發送一個警告等功能。
Apple server
蘋果伺服器。負責接收加密過的定位相關數據並保存。
總結一下,結合 Roles 和 Operation 這兩個概念的內容,外設的 Find My network 的工作流程描述如下:
- 設備擁有者(owner)通過 Find My app 把 外設(accessory )設為擁有者設備(owner device)
- 外設透過 Find My Network 網路、藉助網路的定位功能,把自身的大概位置上傳蘋果伺服器(Apple Server)。
- 設備擁有者通過 Find My app 可以在世界任何地方看到自己的設備
四個角色的關係如下圖所示:
Features
包含以下幾個特性:
Unwanted tracking detection
不必要跟蹤監測,簡稱 UT。我的理解是有這樣的應用場景:可以讓用戶發現不法者放在自己身邊的跟蹤器。
Lost mode
設備的擁有者可以把外設設置為丟失狀態。
Play sound
擁有者的,或者非有擁有者的手機都可以控制外設發出聲音。
前者通過連接後的 BLE Play sound—owner control point 特徵來控制
後者通過連接後的 BLE Play sound—non-owner control point 特徵來控制,只能控制 UT
States
外設的工作流程可以用一個狀態機來描述,如下圖:
Unpaired
未配對狀態。外設第一次啟動或者設置完成之前必須處於該狀態。
在該狀態下,外設必須把 Find My Network 服務作為 primary service 以可連接的廣播類型發出來。
我的理解:
發出可連接廣播,目的在於讓擁有者發現、連上該外設,以便對其進行一些初始配置。
後面應該會講到在配置完成後,發出不可連接的廣播(beacon),這個廣播就攜帶了相關配置資訊,可以對設備進行定位。
Connected
連接狀態。有以下特點:
- 配對流程完成之後,外設必須進入連接狀態(是廢話嗎?還不清楚)
- 外設配對完成之後,擁有者可能會斷開連接(外設多了之後,擁有者沒辦法對所有設備都保持連接,所以斷開?)
- 已配對的外設,不再接受另一個蘋果設備的配對;除非外設已經走完解配對流程(注意,沒說不能連接)
- 外設需要能同時支援兩個蘋果設備同時連接(需要屬於同一個 iCloud ID 的蘋果設備,為啥要同時支援多個?)
- 動作檢查和 UT 協議在連接狀態下失效(因為沒必要)
- 配對過的外設,如果在 10s 內不能完成對鏈路的加密,則應主動斷開連接。
我的理解:
連接狀態似乎不是外設所處的一個主要的狀態。其目的只是為了給外設做一些初始化處理。
Nearby
附近狀態。另外還有以下特點:
- 外設斷開連接之後,必須馬上進入該狀態,並且應該保持 TNEARBY
- 動作檢測和 UT 協議失效(這兩玩意兒是 Separated 狀態專屬的)
- 廣播包帶 nearby key
我的理解:
這個狀態應該也屬於一個過渡的狀態。這個狀態的目的是為了能夠再次連接上?不清楚。
關於外設的狀態機,以目前我的理解,Separated 狀態才是一個正常應用的外設長期所處的狀態。其它狀態都是過渡
Separated
分離狀態。滿足以下條件的外設必須進入該狀態:
- 外設已經配對。並且經歷了初始化流程而啟動(例如,複位)
- 處於 nearby 狀態且已經 TNEARBY 超時
該狀態有兩個功能:動作檢查和 UT 協議
我的理解:
這個狀態是正常使用的外設長期處於的狀態。
一個剛開箱的外設經過連接、配對之後,就會處於該狀態,不斷向外發出帶有密鑰資訊的特定廣播訊號。
要求
前面對 Find My network 外設協議的一些核心概念做了闡述,這個章節會說明一些要求,包括:
- 硬體要求
- 加密
- 軟體鑒權
- 蘋果伺服器公鑰
- 重啟
- 韌體升級
本文只挑一些主要進行說明,具體需要見規格書
硬體要求
藍牙
藍牙控制器必須滿足以下特性:
- LE 2M uncoded PHY。
- Data packet length extension
藍牙發送功率應該固定在大於等於 +4dBm 的水平,且滿足 EIPR(Effective Isotropically Radiated Power ),即天線射頻的方向性也要好
更大的發射功率讓外設更容易被發現且能獲得更頻繁的位置更新;相反的,發射功率低則定位更加精確。
低功耗藍牙外設應該支援:
- LE advertising extensions 以支援其它服務和載荷資訊的發送
- Random resolvable address 且這些地址可周期性輪轉變化
產品規格要求
在 separated 狀態下,應該支援「動作觸發」的 UT 聲音警告:
- 使用加速度感測器實現「動作觸發」
- 使用喇叭等發聲器件實現 UT 警告聲的播放
所謂 UT(Unwanted Tracking Detection ),主要目的在於給用戶一個聲音警告,告知其正攜帶著一個不是自己的外設。
Find My 標識
每個支援 Find My 的外設都應該在產品上戴有一個用戶可見的標識
查找序列號
產品的序列號應該通過一些方式(NRF 或 BLE 連接)可讀
Find My network 可禁用
產品應該實現一個機制來禁用 Find My network 功能,如按按鍵
Find My network 配對模式
產品應該實現一個機制讓其進入配對模式,如長按按鍵 3 秒等
複位
產品應該有個機制來實現恢復出廠設置。恢復出廠設置的產品應該清除掉以下內容之外的所有資訊:
• Accessory information service
• Firmware version
• Serial number
• Software authentication token
• Software authentication UUID
• Apple server public keys
– Signature verification key (Q_A)
– Encryption key (Q_E)
時鐘精度
蘋果設備期望外設達到 200PPM 的計時精度,即每天 17.28s 的誤差。
加密
實現外設和擁有者設備的配對和密鑰的派生功能,需要以下條件:
- A cryptographically secure DRBG
- Modular reduction and addition of big integers
- An implementation of the SHA-256 cryptographic hash function
- An implementation of the ANSI x9.63 KDF (see SEC1, 3.6.1 ANSI X9.63 Key Derivation Function)
- Computations on the NIST P-224 elliptic curve (see FIPS 186-4, D.1.2.2. Curve P-224):
- ECDSA/ECDH over the NIST P-256 elliptic curve (see FIPS 186-4, D.1.2.3. Curve P-256 and Pairing for more details).
- AES-128-GCM encryption and decryption
軟體鑒權
定義、作用理解中。。。
蘋果伺服器公鑰
定義、作用理解中。。。
斷電重啟
設備斷電重啟後應該進入 separated 狀態等一些要求
韌體升級
外設必須能支援韌體升級功能,且包含以下要求:
- 有一個機制來確保韌體的完整性
- 待升級韌體在發布前需要完成 MFi 認證的要求
- 韌體的版本不可以降級