本项目为需要2FA才能打开的保险箱。使用resin.io和Authy构建。
描述
物联网主要是将物联网带入互联网,但也将互联网带入物联网。银行账户或比特币钱包等关键任务服务网站提供双因素身份验证(2FA)已有一段时间了,它不仅提供了密码,还提供了额外的安全层。由于resin.io旨在跨越互联网与现实世界之间的鸿沟,我们决定通过构建一个需要2FA才能打开的保险箱来将这一概念付诸实践。
通过将resin.io与Twilio的Authy相结合,我们可以通过一个非常简单的部署系统——gitpushresinmaster——和一种添加2FA机制的非常简单的方法来实现这一点。
保险箱和储物柜通常通过钥匙或在数字键盘上敲击代码来打开。我们提出了一种替代方法,将数字代码与通过Authy发送到用户手机的SMS相结合,这意味着打开保险箱需要同时拥有代码和手机。
细节
我们在原型板上使用了RaspberryPi2和一个小电路。锁本身是一个5V螺线管。
Pi运行一个node.js服务器,该服务器通过一个简单的Web界面执行身份验证。我们使用Authy提供第二因素身份验证和resin.io以实现超简单的代码部署。
锁定和解锁保险箱的程序如下:
用户输入他们的电子邮件。
如果是新用户,他们会被要求提供电话号码。
UI要求用户输入密码来锁定保险箱。
当用户输入密码时,锁被接合。
完成后,打开保险箱:
首先,用户必须输入正确的代码。
输入代码后,Authy会向用户发送短信。
用户输入短信密码,锁打开。
锁只打开几秒钟,但可以通过按UI上的“打开”按钮再次打开。
当您在手机上使用UI时,您通常可以在SMS代码到达时输入它,因为它会显示在手机的通知区域中。
构建说明
硬件
螺线管驱动器的电路原理图如下所示:
这是我们在原型板上组装螺线管驱动器的方式:
软件
RaspberryPi运行一个node.js服务器,该服务器实现了多步身份验证机制,为了实现这一点,我们设计了一个使用machina.js的状态机,通过express.js在HTTP上提供服务。大多数交互都在socket.io上进行,以向用户提供实时反馈。
我们使用“authy”npm包轻松地与AuthyAPI交互,从他们的教程中借用一些代码。
状态机由产生从一种状态到另一种状态的转换的状态和事件组成——我们在应用程序中使用的模型“Safebox”具有“打开”和“关闭”状态,从一个状态到另一个方向的转换,通过通过处理身份验证过程的中间状态。
每当用户与UI交互时,都会通过socket.io触发输入事件,并将其传递给状态机。
下面的代码是如何定义这些状态和转换的示例:
当机器转换到“关闭”状态时,它的_onEnter函数被称为禁用锁并保存这个新状态。当用户随后输入代码时,我们将其与他们的密码进行比较,只有在匹配时才转换到下一个状态。
我们使用MongoDB来保存盒子的当前状态和用户数据——存储用户数据允许我们存储用户的密码和电话号码,这样他们就不需要在每次重启设备时重新配置他们的设备。
集成用户模型的代码还与AuthyAPI交互,该API提供了向用户发送SMS并验证他们提供的代码的方法。
在客户端,我们有一个简单的单页jQuery应用程序,它为每个状态机的状态显示不同的HTML内容,监听拨号盘和输入上的事件,发送socket.io消息并为用户提供适当的反馈。我们使用Bootstrap和toastr快速设计了一个相当赏心悦目的界面:)
我们使用resin.io将所有内容与设置环境并运行我们的启动脚本的Dockerfile绑定在一起:
我们的start.sh脚本然后启动MongoDB(在不正常关闭的情况下修复它)和我们的Web服务器:
使用resin.io使我们的部署就像输入‘gitpush’一样简单,而且它允许我们使用docker确保我们所有的依赖关系都以完全相同的方式满足每个设备。
全部0条评论
快来发表一下你的评论吧 !