浅析 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 外设的定位数据,链接如下:
https://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 认证的要求
- 固件的版本不可以降级
浅析 Find My 原理的更多相关文章
- [转帖]浅析Servlet执行原理
浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...
- 浅析Servlet执行原理
在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...
- 浅析HTTP代理原理--转
代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...
- 浅析JAVA Runtime原理与过各大厂商免杀webshell制作
Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...
- webpack系列--浅析webpack的原理
一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架 ...
- 浅析HTTP代理原理
代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...
- Cordova 浅析架构的原理
因为项目使用了Cordova,也使用了很长时间.至于有很多hybride框架,为什么我们使用Cordova,这里不做过多的叙述,我们也是根据项目需求来选定的,需要及时更新.还要输出别人SDK等.没有最 ...
- 浅析ReDoS的原理与实践
转载于http://www.freebuf.com/articles/network/124422.html ReDoS(Regular expression Denial of Service) 正 ...
- 浅析SSH核心原理(二)
Hibernate是一个开放源代码的ORM(对象-关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任 ...
随机推荐
- SpringBoot配置本地文件映射路径
1.前言 在springboot的项目中,如果需要通过项目方式访问本地磁盘的文件,不仅可以使用nginx代理的方式,还可以使用springboot配置的方式进行访问. 实例原因说明:由于上传的图片是要 ...
- 🤔 移动端 JS 引擎哪家强?美国硅谷找......
如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...
- 后端程序员之路 35、Index搜索引擎实现分析4-最终的正排索引与倒排索引
# index_box 提供搜索功能的实现- 持有std::vector<ITEM> _buffer; 存储所有文章信息- 持有ForwardIndex _forward_index; ...
- ELK----elasticsearch7.10.1安装配置
环境: vmware centos7 1.下载适合自己的es版本 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-1 ...
- day1_安装及建立数据库和表
#第一份数据库及表create database library; use library; create table book( id int primary key, book_name char ...
- Java 读取Word文本框中的文本/图片/表格
Word可插入文本框,文本框中可嵌入文本.图片.表格等内容.对文档中的已有文本框,也可以读取其中的内容.本文以Java程序代码来展示如何读取文本框,包括读取文本框中的文本.图片以及表格等. [程序环境 ...
- 2020年12月-第02阶段-前端基础-CSS Day07
CSS Day07 CSS高级技巧 理解 能说出元素显示隐藏最常见的写法 能说出精灵图产生的目的 能说出去除图片底侧空白缝隙的方法 应用 能写出最常见的鼠标样式 能使用精灵图技术 能用滑动门做导航栏案 ...
- 2020年12月-第01阶段-前端基础-HTML常用标签
1. HTML常用标签 首先 HTML和CSS是两种完全不同的语言,我们学的是结构,就只写HTML标签,认识标签就可以了. 不会再给结构标签指定样式了. HTML标签有很多,这里我们学习最为常用的,后 ...
- 不用任何框架,Java 就能实现定时任务的 3 种方法!
是的,不用任何框架,用我们朴素的 Java 编程语言就能实现定时任务. 今天,栈长就介绍 3 种实现方法,教你如何使用 JDK 实现定时任务! 1. sleep 这也是我们最常用的 sleep 休眠大 ...
- Cookie实现记住密码、自动登录
前端代码 <form id="form" action="xxx" method="post"> <div> < ...