我的物联网:Guest Castle(第2部分)

嗨,GT!一切与过去和过去!
我继续讲述如何将门锁连接到互联网的故事。从这里开始
非常感谢大家的评论。确实有现成的解决方案,但是也有许多细微之处使我无法使用它们。公寓仍然不是酒店,因此我们立即撤消了专门的酒店城堡。钥匙锁,NFC天线,以免吓到邻居,我们也不考虑。不能使用卡,令牌或其他物理介质,可以理解的是,在客人打开门之前,无法将其转移给客人。
无法使用Kevo,August或Lockitron,因为它们基于美式锁(死锁),这种锁不能很好地安装在65-70毫米厚的钢门上。我们的选择是用于装甲门的机电式CISA,价格约为500欧元(尚未购买,因为价格昂贵)。
最重要的是,我想用自己的双手做些事情,而不是为了爱好而自私。


让我提醒您,锁控制器位于本地家庭网络中NAT的深处,因此在Arduin上建立Web服务器是没有意义的;无法从Internet到达它。该服务器使用Twisted框架以Python编写,在另一个具有真实IP地址的地方在Linux上运行,控制器连接到该服务器并等待命令。

现在,我想谈谈工作和加密的逻辑。
我没有找到对Arduina的流量进行加密的内容,因为城堡和服务器之间的通信将通过未加密流量的开放通道进行。
在第一个原型中,我使用了MD5,现在将其更改为SHA-1,在此Cryptosuite库中。它消耗更少的内存,并且已经有现成的HMAC功能。
密钥是最多30个ASCII字符的密码,存储在控制器的EEPROM存储器中。
在第一个原型中,相同的密码已明确存储在服务器上,这当然不是安全的。第二个原型需要两个密码。第一种是在连接到服务器时对锁进行身份验证,您无法使用此密码打开锁,这是必需的,以便只有正确的锁才能连接到服务器。
锁连接到服务器,并首先告诉它其标识符。服务器在数据库中检查是否存在这样的锁,如果存在,它会发送一个随机生成的ASCII序列作为响应。锁使用密码“签名”它,然后将哈希发送回去。服务器将接收到的哈希值与其自己计算出的哈希值进行比较,如果它们匹配,它将授权连接的控制器为“锁”。
否则,将重置连接。
第二个密码已经是一个数字密钥;它没有存储在服务器上。
它的工作方式如下:用户应用程序通过服务器上的SOAP函数进行调用,指示锁的ID和他要发送给他的命令。结果,该函数返回请求ID。服务器将此命令转发给控制器,控制器发送随机生成的ASCII序列作为响应,并等待“正确”响应几秒钟。接下来,用户应用程序需要通过相同的SOAP(通过请求ID)从服务器获取它,并使用数字密钥对其进行签名并发回。
控制器将接收到的哈希与自己计算的哈希进行比较,如果匹配,它将执行先前接收的命令,并报告给服务器。
确认命令的时间限制为2秒,如果在此期间未收到任何响应,则控制器将忽略先前收到的命令。如果哈希值不匹配,该命令也将被忽略。
因此,我试图保护自己免受“中间人”攻击,这很容易安排在提供者的网络上。那里的连接很简单,没有密码和证书,足以在屏蔽层中剪断双绞线,将其挤压在两侧,使用命令服务器的IP地址从公寓一侧将其插入网络,在另一端模拟锁(我还在python上编写了用于仿真的脚本以进行调试),通过窃听方式安排了这种“防火墙”。
就此而言,我认为城堡受到了相当大的保护。
即使入侵命令服务器并使用密码进行锁授权来窃取其数据库也不会造成太大麻烦,因为它们无法打开锁。
它仍然只与客人打交道。这些是第一篇文章中的6-8号要求。
键盘,代理,RFID和NFC都不是一种选择,上面写道了原因。但是几乎每个人都拥有智能手机,并且所有智能手机都具有蓝牙,因此选择显而易见!

在第一个原型中,访客与一个访问代码相关联。在此代码的服务器数据库中,存储了锁的ID,访客访问开始和结束的日期和时间,以及访客可读的名称的文本字段。
访客接近锁,在其智能手机上启动移动应用程序,它通过蓝牙将访问代码发送到控制器,一条消息从控制器到达服务器,表明访客已使用某个访问代码来联系他。服务器根据数据库检查它,如果正确的访客在正确的时间在正确的位置到达,则发送命令以打开锁。实际上,访客将发送一个带有“临时标记”(Unix时间的字符串表示形式,除以30,除掉小数部分)签名的HMAC哈希,而不是明确的访问代码。验证服务器向数据库发出请求,并选择给定锁的所有当前有效访问代码,然后对其进行遍历并为它们计算相似的HMAC,如果找到匹配项,则发送打开命令,如果对访问码的搜索在找到匹配项之前结束,则将尝试打开锁的否定响应发送给锁。
问题在于,用于这种授权的数字密钥必须存储在服务器上。
我不得不使第二个原型的“来宾”授权复杂化。访客访问代码现在由两个键组成,我们称它们为“服务器”和“私有”。服务器需要在服务器上建立来宾帐户,而私有则需要自己打开锁。服务器机房将被明确地存储在服务器上,而从私有机房仅将有一个哈希,而不是简单的哈希,而是一个具有数字锁的HMAC。
现在,来宾授权会话如下所示:
1.来宾应用程序将“服务器”密钥传递给控制器​​(如第一个原型中的其哈希),并且
2.服务器以相同方式进行检查,但不是打开命令发送私钥的哈希
3.控制器将从服务器接收到的私钥的哈希值与独立计算的哈希值进行比较,如果匹配,则打开锁。
因此,服务器不存储任何可能打开锁的内容。如果不知道数字密钥,将无法生成所需的哈希。
相同的蓝牙也可用于没有Internet的“主”访问。控制器通过它接收命令,并以一次性代码响应,该代码必须用正确的数字键签名2秒钟。
通过它,我想进行控制器的基本设置。所有者按下控制器上的特殊按钮,然后开始接受扩展的命令集,例如设置锁定ID,秘密密钥,服务器端口地址,网络设置等。但是在Adruin中,内存用完了,草图不适合。
最后,简短演示了这项工作。

Source: https://habr.com/ru/post/zh-CN382677/


All Articles