本項目為需要2FA才能打開的保險箱。使用resin.io和Authy構(gòu)建。
描述
物聯(lián)網(wǎng)主要是將物聯(lián)網(wǎng)帶入互聯(lián)網(wǎng),但也將互聯(lián)網(wǎng)帶入物聯(lián)網(wǎng)。銀行賬戶或比特幣錢包等關(guān)鍵任務(wù)服務(wù)網(wǎng)站提供雙因素身份驗證(2FA)已有一段時間了,它不僅提供了密碼,還提供了額外的安全層。由于resin.io旨在跨越互聯(lián)網(wǎng)與現(xiàn)實世界之間的鴻溝,我們決定通過構(gòu)建一個需要2FA才能打開的保險箱來將這一概念付諸實踐。
通過將resin.io與Twilio的Authy相結(jié)合,我們可以通過一個非常簡單的部署系統(tǒng)——gitpushresinmaster——和一種添加2FA機制的非常簡單的方法來實現(xiàn)這一點。
保險箱和儲物柜通常通過鑰匙或在數(shù)字鍵盤上敲擊代碼來打開。我們提出了一種替代方法,將數(shù)字代碼與通過Authy發(fā)送到用戶手機的SMS相結(jié)合,這意味著打開保險箱需要同時擁有代碼和手機。
細(xì)節(jié)
我們在原型板上使用了RaspberryPi2和一個小電路。鎖本身是一個5V螺線管。
Pi運行一個node.js服務(wù)器,該服務(wù)器通過一個簡單的Web界面執(zhí)行身份驗證。我們使用Authy提供第二因素身份驗證和resin.io以實現(xiàn)超簡單的代碼部署。
鎖定和解鎖保險箱的程序如下:
用戶輸入他們的電子郵件。
如果是新用戶,他們會被要求提供電話號碼。
UI要求用戶輸入密碼來鎖定保險箱。
當(dāng)用戶輸入密碼時,鎖被接合。
完成后,打開保險箱:
首先,用戶必須輸入正確的代碼。
輸入代碼后,Authy會向用戶發(fā)送短信。
用戶輸入短信密碼,鎖打開。
鎖只打開幾秒鐘,但可以通過按UI上的“打開”按鈕再次打開。
當(dāng)您在手機上使用UI時,您通常可以在SMS代碼到達(dá)時輸入它,因為它會顯示在手機的通知區(qū)域中。
構(gòu)建說明
硬件
這是我們在原型板上組裝螺線管驅(qū)動器的方式:
軟件
RaspberryPi運行一個node.js服務(wù)器,該服務(wù)器實現(xiàn)了多步身份驗證機制,為了實現(xiàn)這一點,我們設(shè)計了一個使用machina.js的狀態(tài)機,通過express.js在HTTP上提供服務(wù)。大多數(shù)交互都在socket.io上進行,以向用戶提供實時反饋。
我們使用“authy”npm包輕松地與AuthyAPI交互,從他們的教程中借用一些代碼。
狀態(tài)機由產(chǎn)生從一種狀態(tài)到另一種狀態(tài)的轉(zhuǎn)換的狀態(tài)和事件組成——我們在應(yīng)用程序中使用的模型“Safebox”具有“打開”和“關(guān)閉”狀態(tài),從一個狀態(tài)到另一個方向的轉(zhuǎn)換,通過通過處理身份驗證過程的中間狀態(tài)。
每當(dāng)用戶與UI交互時,都會通過socket.io觸發(fā)輸入事件,并將其傳遞給狀態(tài)機。
下面的代碼是如何定義這些狀態(tài)和轉(zhuǎn)換的示例:
當(dāng)機器轉(zhuǎn)換到“關(guān)閉”狀態(tài)時,它的_onEnter函數(shù)被稱為禁用鎖并保存這個新狀態(tài)。當(dāng)用戶隨后輸入代碼時,我們將其與他們的密碼進行比較,只有在匹配時才轉(zhuǎn)換到下一個狀態(tài)。
我們使用MongoDB來保存盒子的當(dāng)前狀態(tài)和用戶數(shù)據(jù)——存儲用戶數(shù)據(jù)允許我們存儲用戶的密碼和電話號碼,這樣他們就不需要在每次重啟設(shè)備時重新配置他們的設(shè)備。
集成用戶模型的代碼還與AuthyAPI交互,該API提供了向用戶發(fā)送SMS并驗證他們提供的代碼的方法。
在客戶端,我們有一個簡單的單頁jQuery應(yīng)用程序,它為每個狀態(tài)機的狀態(tài)顯示不同的HTML內(nèi)容,監(jiān)聽撥號盤和輸入上的事件,發(fā)送socket.io消息并為用戶提供適當(dāng)?shù)姆答仭N覀兪褂肂ootstrap和toastr快速設(shè)計了一個相當(dāng)賞心悅目的界面:)
我們使用resin.io將所有內(nèi)容與設(shè)置環(huán)境并運行我們的啟動腳本的Dockerfile綁定在一起:
我們的start.sh腳本然后啟動MongoDB(在不正常關(guān)閉的情況下修復(fù)它)和我們的Web服務(wù)器:
使用resin.io使我們的部署就像輸入‘gitpush’一樣簡單,而且它允許我們使用docker確保我們所有的依賴關(guān)系都以完全相同的方式滿足每個設(shè)備。
-
保險箱
+關(guān)注
關(guān)注
0文章
11瀏覽量
6829 -
樹莓派
+關(guān)注
關(guān)注
121文章
1963瀏覽量
107081
發(fā)布評論請先 登錄
保險箱智能化真的有必要嗎?
IC 卡保險箱
什么是身份驗證和授權(quán)
什么是詢問握手身份驗證協(xié)議
什么是密碼身份驗證協(xié)議
淺談雙因素身份驗證的三個風(fēng)險和缺點
人臉識別在養(yǎng)老保險身份驗證系統(tǒng)中的應(yīng)用
塑料的保險箱 你敢用嗎?
了解如何創(chuàng)建Arduino保險箱

評論