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