从物联网设备生命周期理解Apple Homekit框架
本次笔记主要基于苹果公开的HomeKit Accessory Protocol协议文档和IOS Security Guide中相关部分。
总体来讲,设备与App之间采用端到端的加密,密钥由设备和App自己协商存储,云只负责在云上维护身份并且转发消息给客户端。用户的控制分为两部分,一部分是云端控制,一部分是设备自己存储凭据控制。这个分布式的访问控制系统不可避免的存在一些同步上的瑕疵。
1. 发现与绑定
(1)使用IP地址的设备要求支持Bonjour来发现设备。Bonjour是在局域网中寻找服务的一个主要方法。这项技术广泛用于Mac OS X,允许用户不用在任何设置下建立一个网络连接。
(2)设备与App用户的绑定称为pair(配对)过程。配对的结果就是设备与App互相交换了自己生成的公钥并且存储,利用公钥来进行未来的身份认证。简要概括如下(忽略细节):
a. 设备生成(或固定)一个setup code,形如101-22-333,App需要通过某种第三方渠道(如扫设备上的二维码)获得这个码来开始配对过程。开始配对时设备要验证App发来的setup code是否正确。
b. 通过苹果厂商级认证的设备会有一个证书类似的东西,在配对开始时给App,否则App会提示设备未认证,需要用户确认风险并点击继续。
c. App和设备各生成一个公私钥对,通过密码算法进行交换,然后存储起来作为未来认证配对的依据,即这个公钥就是身份。至此与设备配对结束。
d. 设备通过某种方式映射到了iCloud中。设备、家庭、用户数据可以在iCloud中加密同步。在iCloud中用户有home的单位来管理设备和其他用户。
(3)注意:设备被绑定后(有至少一个管理员)账号后,会拒绝其他用户绑定。设备会上报自己的设备ID给App,设备ID协议中要求每次重置更新。
2. 控制
(1) 局域网控制:局域网控制利用绑定过程中商定的公钥来做身份认证,之后协商出加密密钥来保持长连接通信。
(2)远程控制:设备只与家中的Hub通信(仅apple TV、ipad可以作为hub)。利用某种机制,用户通过iCloud将要做的请求发给在家中局域网的Hub(ipad),由ipad代为操作控制设备。(产生了个疑问,主人用手机绑定了设备,手机和ipad共享的是一个私钥身份吗?)
3. 分享与取消分享
谈到分享,首先讲一下Homekit的用户管理控制。设备上存有各个用户的名字和公钥,每个用户有对应的管理员标志位。只有管理员才可以进行用户管理操作,
(1)分享:官方正常App操作流程中,(猜测)利用iCloud分享出公私钥给被分享者,同时给设备添加该公钥到用户列表中,将被分享用户添加至iCloud的home中。在有hub的情况下,主人可以将用户设置成管理员;但是在设备中并没有将该用户设置成管理员,被分享用户需要添加别的用户时,只能是在iCloud上添加,然后主人的hub代为执行添加用户的操作。所以homekit有个缺点,必须拥有hub才能将分享用户设置为管理员;同时这也保证了安全:用户App中可以通过云来管控所有的授权用户,而杜绝了被分享用户偷偷地在局域网添加与操作访问控制。
(2)取消分享:官方App中,首先会通过iCloud的home中删除被分享用户,然后再局域网通知设备让设备删除该用户的public key。但是,这两部是分开执行的,若删除用户时主人不能与设备通信,则仅会删除云中的用户,App会在跟设备再次建立连接时执行操作。也就是说这两方的删除同步上存在问题,不过安全风险很小,App会记得保留状态只要能和设备通信就删除那个用户。
4. 删除设备
主人在云端删除该设备,同时给设备发送删除自己的命令。当设备判断用户列表中没有管理员后,会删除所有的用户。
注意只有管理员才能在设备上删除用户,所以由于被分享者不是管理员,他不能从设备上删除自己。因此,被分享者删除自己其实只是退出了iCloud上的home,主人app界面中的home仍然可以看到该用户在,因为毕竟设备上的密钥还没删,其实被分享者是可以控制的。
By Ascii0x03,转载请注明出处:https://www.cnblogs.com/ascii0x03/p/11198608.html
从物联网设备生命周期理解Apple Homekit框架的更多相关文章
- JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期
JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成ser ...
- Jasper:用户指南 / 设备 / 生命周期管理 / SIM 卡状态
ylbtech-Jasper:用户指南 / 设备 / 生命周期管理 / SIM 卡状态 1.返回顶部 1. SIM 卡状态 每个设备都有一个状态,决定了它能否在网络上建立数据连接,并且会影响设备是否计 ...
- activity学习(1) 生命周期理解
可以忽略onWindowFocusChanged.onSaveInstanceState.onRestoreInstanceState几个事件,这几个事件官网中的生命周期里面没有提到.忽略掉这几个方法 ...
- maven生命周期理解
你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点.当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期. 知道了每套生命周期的大概用途和相互关系 ...
- Maven的构建生命周期理解
以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...
- Activity生命周期理解
在Android应用程序运行时,Activity的活动状态由Android以Activity栈的形式管理,当前活动的Activity位于栈顶.随着应用程序之间的切换.关闭等,每个Activity都有可 ...
- [转] Actor生命周期理解
[转] https://blog.csdn.net/wsscy2004/article/details/38875065 镇图:Actor内功心法图 Actor的生命周期可以用Hooks体现和控制,下 ...
- spring web 生命周期理解
spring web /bean 生命周期 反射注解 aop代理类生成 init servlet 初始化 load spring-context.xml load XmlParser 类解析对象 ...
- Spring的Bean生命周期理解
首先,在经历过很多次的面试之后,一直不能很好的叙述关于springbean的生命周期这个概念.今日对于springBean的生命周期进行一个总结. 一.springBean的生命周期: 如下图所示: ...
随机推荐
- SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作)
SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作) 2012-12-21 未来决定... http://www.ebama.net/thread-107643-1-1.html ...
- hdu1525 博弈
/* n%m==0 n状态 n>=2*m 先手决定谁来面对当前的状态,并且可以知道状态,所以先手必胜. */ #include<stdio.h> int min(int x,int ...
- this的作用
1.在一般函数方法中使用 this 指代全局 function test(){ this.x = 1; alert(this.x); } test(); // 1 2.作为对象方法调用,this ...
- Python进阶04函数的参数对应
我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的 参数传递方式. 回忆一下位置传递: def f(a,b,c): return ...
- LRJ-Example-06-04-Uva11988
单向链表的元素存放在数组s[]中,next指针存放在数组next[]中. 链表初始为空,next[0] == 0 代表链表结尾,类似NULL指针,在最后打印链表的时候作为for循环结束的条件. 依次插 ...
- hdu 4179 Difficult Routes (SP)
Problem - 4179 坑了我一个晚上的SP题. 题意是,给出若干空间中的点,给出其中某些点之间是有直线线段路径相连的.要求求出一条从s开始到t结束的路径,它的难度是d.难度的计算是空间线段两点 ...
- 2019-8-31-PowerShell-通过-WMI-获取系统服务
title author date CreateTime categories PowerShell 通过 WMI 获取系统服务 lindexi 2019-08-31 16:55:58 +0800 2 ...
- laravel 学习笔记blog后台
https://github.com/almasaeed2010/adminlte composer require "almasaeed2010/adminlte=~2.0"
- JS获取手机型号和系统
废话不多说,直接上源码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...
- SuperSocket接收过滤器工厂(ReceiveFilterFactory)
接收过滤器工厂(ReceiveFilterFactory)用于为每个会话创建接收过滤器. 定义一个过滤器工厂(ReceiveFilterFactory)类型, 你必须实现接口 IReceiveFilt ...