動態密碼之門禁系統 詳細製作流程公開

本文敘述了基於Espressif ESP8266 的動態密碼之門禁系統方案中詳細的製作過程,供各位參考,若有任何改進的建議,筆者將不吝指教,先行致謝。

發想

筆者現在於某公司實習,我親身體會到傳統密碼想保有高安全性,卻設下了種種複雜的規則與限制。所以,筆者在此自行製作了簡易的登入方式。

方案大意

筆者在登入各大網站時,也與各位相同,要自己想帳戶名與密碼,因此,我想製作既不用花時間取個吉利的名字;也不用耗精力擠出可怕的密碼,可以輕鬆驗證身分的登入系統。

應用場景

筆者在設計此方案時,是在公司內部運作,則帳戶使用工號最為適宜,可以透過公司分發的員工證感應,以取得工號。密碼則是使用TOTP技術,由系統生成具有時效性的密碼。

材料

  1. 核心控制裝置 :為了開發方便,選用Arduino Mega 2560
  2. 文字顯示螢幕 :LCD
  3. 使用者輸入 :薄膜鍵盤
  4. 員工證感應裝置 :NFC
  5. TOTP QRcode螢幕 :OLED…真不好受,詳見後記
  6. 時間記憶裝置 :RTC,TOTP協議所需
  7. 網路傳輸裝置 :ESP8266,雖然多一片MCU…多一份成本,但開發真方便!

硬體架構簡述

        為了方便,LCD、NFC、RTC、OLED裝置都是走I²C協議,所以只要電源、接地、串列時脈、串列資料線,萬分感謝I²C在杜邦線交雜的環境下,訊號傳遞正確性非常不賴(因為I²C正常用在焊接好的電路板上)。

        至於薄膜鍵盤,普通的接至GPIO。ESP8266則是走UART協議。

初期硬體架構

        我先製作好了外殼,雖然是個箱子,但有上方面板就足矣,零件都嵌在面板上。為了有點造型感&人性化,將面板傾斜約30度。

       

       
不過當時Arduino Mega與ESP8266,當時是固定於外殼底部,當面板要掀開時,零件與控制器之間的杜邦線須被迫拆除。

       

後期硬體架構

        最後,實在是忍受不了,每次維修皆須重配電路,我將控制器移至面板背面,還腦洞大開的將他們焊接至萬用板上,可真是苦了筆者的焊接技術。

       

並且,我還將兩個控制器溝通的UART線路,改由銅線焊上,而非杜邦線,畢竟UART一開始在哪,就不會變了。因為焊接的永久連接性,我感到了樸實無華的穩定線路安全感…。

軟體架構簡述

      既然是要做登入系統,那就要先想出步驟來:

  1. 顯示初始歡迎介面
  2. 按確認鍵,以使用系統
  3. 選擇登入或註冊

註冊分支:

  1. 請求感應員工證(或其他NFC裝置)
  2. 顯示QR code,引導使用者下載TOTP程式
  3. 顯示QR code,引導使用者存入TOTP金鑰
  4. 請求TOTP密碼,驗證存入成功
  5. 記憶NFC UID與TOTP金鑰
  6. 上傳註冊紀錄至後台,返回初始歡迎介面

登入分支:

  1. 請求感應員工證(或其他NFC裝置)
  2. 請求TOTP密碼,驗證身分
  3. 顯示登入結果
  4. 上傳登入紀錄至後台,返回初始歡迎介面

好像有地方怪怪的!

        我知道…我知道,登入之後啥都沒有,還自動回到歡迎介面,但是Hey!本方案的重點是門禁,而不是門禁的背後有什麼。畢竟我做不出像Amazon IAM那種大型的管理系統(但我會努力的)。

軟體架構

        因筆者學習過FPGA,想將上述步驟,直接照搬有限狀態機(Finite State Machine)的概念來做,建置的同時,也方便增加串列訊息輸出,驗證每個function是否正確運作。

       

 

        基於TOTP金鑰要編碼為Base32,我上維基百科學了好一陣子,才將此編碼轉化為程式碼。

       

 

        雖然單獨分開後,每個function都很簡單,但結合起來後,就是會有些毛病在,修修改改後終於是可以運作了,以下為詳細的流程圖:

       

 

        至於上傳到後台,我使用Google Script與Google Sheet做串接,ESP8266收集此次登入/註冊資訊後,傳送至Google Script API,透過Google Script整理好資料後,儲存於Google Sheet。

       

 

       

 

後記

        嗯…真的有QR code跑出來了,連筆者自己都因這些精密電子毫無錯誤的訊號傳遞結果感到讚嘆,不過,此QR code裝置在弱光/強光環境下,會過曝/亮度不足,有時需要靠運氣才掃得到。

       



        我額外製作了線路匯流排,以利佈線&防止插錯,焊接時,為了偵錯而立了大功。

       

       實際上,需要用到的I/O很少,我也知道MCU的ROM也是越小越好,可以進一步壓低成本,不過,我的程式碼真的是太肥了!

       

        最後,感謝觀看此博文,歡迎任何問題&建議。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論