本項目為需要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文章
11瀏覽量
6716 -
樹莓派
+關注
關注
116文章
1706瀏覽量
105608
發布評論請先 登錄
相關推薦
評論