利用树莓派完成双重身份验证的保险箱

描述

本项目为需要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确保我们所有的依赖关系都以完全相同的方式满足每个设备。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分