5

超省資安強化方案 - 比雞排便宜的自製 USB 實體金鑰

 1 year ago
source link: https://blog.darkthread.net/blog/low-cost-diy-usb-security-key/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

比雞排便宜的自製 USB 實體金鑰-黑暗執行緒

密碼是最常用的資安防護手段,但它不夠安全也是眾所周知,頂多十來個字元,只要被猜到、被偷看、被側錄,任何人都能假扮你的身分,下載你的資料,代替你下單。

於是,出現許多補強或替代密碼的手段,像是指紋、臉部識別、晶片卡、RFID、實體金鑰。其中 USB 實體金鑰是我心目中個人電腦上取代密碼的最佳方案,原本輸入密碼的環節,改為插入實體金鑰(必要的話再加碼輸入 PIN 碼)立即安全升級,簡單又直覺。即使實體金鑰被偷走,金鑰鎖在硬體內無法匯出複製出第二把,再加上需要 PIN 碼才能使用,PIN 碼錯三次自動鎖住停用等保護機制,在安全上完勝單純密碼或檔案式金鑰。

市面上已經有很多成熟的實體金鑰產品 (參考:PC 雜誌評比),可當作 Gmail、FB、Github 的多重因素認證,用於 SSH 或網頁登入,甚至用來加密及簽章。其中功能最齊支援最廣的應屬 YubiKey,其支援 WebAuthn, CTAP 1, CTAP 2, U2F, smart card, Yubico OTP, OATH (HOTP/TOTP), OpenPGP, 靜態密碼保護等功能,還防水防摔,除了價格偏高沒什麼缺點(USB-A 版大約美金 50 元左右)。參考

如果預算充足也不想多花時間研究,購買現成產品是最便利且可靠的選擇。

Fig2_638256120785753814.png

照片來源

好,講完正常人的選擇,還願意繼續往下看的朋友,想必都懷有好奇心或自己動手做的熱情,那我來聊聊最近找到的超便宜 USB 實體金鑰解決方案,用不到一塊雞排的價錢得到一支可以加解密、做電子簽章還能寫程式整合的實體金鑰。

我對實體金鑰加密跟數位簽章這個議題一直很有興趣,十多年前甚至幫 RUN!PC 雜誌寫過文章(紙本雜誌不知收哪去了,只找到稿件檔),介紹用 .NET 程式整合自然人憑證做數位簽章:

Fig1_638256120787600174.png

自然人憑證能做的事有限,像是不能拿來登入 SSH,加上憑證需由政府簽發,不能自己在家發幾張玩玩。我一度把腦筋動到過期的晶片信用卡上,猜想裡面應該也存有公私鑰,但晶片信用卡的規格封閉公開資料難找,外行人很難下手。

前陣子意外發現我手上的便宜實體金鑰(說便宜其實也也要近千元)居然能用來登入 SSH,美中不足之處是需依賴特殊版本 Putty (CAC 版),不能整合 SSH CLI 談不上方便。所幸,本站的讀者們臥虎藏龍,貼文後很快獲得重要情資(感謝 Jim、許智涵分享):不只 Yubikey、較便宜的uTrust FIDO2 Security Key 也能支援 Win32 OpenSSH CLI, 而最令我驚喜的是 - 有個更便宜的 DIY 解法 - 有種 USB 行動碟大小的 STM8/STM32 單晶片(MCU)開發板硬體偵錯器,可改刷開源加密金鑰軟體 - (Gnuk),搖身一變成為 USB 實體金鑰!

thumbnail

最酷的是,這款偵錯器超便宜,網拍價格落在台幣 60 到 100 元之間(批量大一點或從淘寶買,甚至不用 50 元),差不多是市售 USB 實體金鑰產品十分之一到 20 分之一的價格。當然,功能上及方便性無法與正式產品相提並論,且製作有技術門檻,需要一點開發背景及電子手工藝經驗... 嗯,這是我的菜無誤!

做了點功課,故事的來龍去脈如下。

這支名為 ST-LINK v2 的 USB 偵錯器,裡面有顆型號為 STM32F103C8T6 的單晶片(MCU),理論上只需 64KB Flash 記憶體跑偵錯軟體,但廠商佛心地用了 128KB 的規格,剛好能放進大小 110KB 又支援 STM32 系列的 Gnuk 加密金鑰軟體。要刷 Gnuk 軟體進去,則需要兩支 ST-LINK v2,一支接電腦,透過 openocd 軟體將另一支改刷成 Gnuk。

ST-LINK v2 刷完 Gnuk 後,再插上電腦會變成一台讀卡機加智慧卡,可以拿來存入金鑰,當成實體金鑰使用。

Fig4_638256120792062650.png

不過,ST-LINK v2 雖然便宜,要刷成 Gnuk 有一些坑。市面上不少產品用的是相容晶片,有些甚至 Flash 只有 64KB,購買要碰點運氣。參考 像我買到的版本用的是 Geehy APM32 相容晶片(幸好是 128KB),要改參數才能刷新。

燒錄時的接線是另一項挑戰,共要接四條線,GND、3.3V、Clock 及 IO,3.3V 跟 GND 接原本排針就行了,Clock 及 IO 必須接上電路板的接點,有些版本會做成排針焊孔,而我買的則是平面焊盤,怎麼將電線固定上去是個問題。我手邊剛好有 IC 測試鉤,輕鬆過關。另外,我買的版本電路板上有印接點用途,有些版本需要用三用電錶自己查線:

thumbnail

Gnuk 的原始碼需自己編譯成 Image,編譯需要 Linux 環境,在 Windows 上用 WSL 即可,但有點小眉角,目前 Git master 分支的無法編譯,要切到舊版分支才行。參考 (所以這年頭想在江湖走跳,不會點 Git 不行呀!)

如果想在加密或簽章時加入按鈕確認程序,需改幾行程式 參考,並在電路板上加顆按鈕。拆掉尾端排針,我找到一顆報廢滑鼠的微動開關,稍微喬個角度焊在 CLK 跟 3.3V,簡單裝上去,由於是微動開關,輕觸便有反應,靈敏度出奇地好。
(註:按鈕確認類似 WebATM 讀卡機轉帳時要抽出卡片再插入,把使用者在電腦前配合操作實體當成第二道檢核,讓駭客無法靠遠端控制完成作業)

thumbnail

最後還要學習如何用 GPG 建立金鑰 (GPG 是 Gnu Privacy Guard 縮寫,一套歷史悠久的開源加密及數位簽章軟體,Git for Windows 有附帶以支援為 Commit 加上數位簽章),將金鑰存進實體金鑰,之後便可用實體金鑰加密及簽章,不像金鑰檔案在電腦入侵時會被偷走。如果擔心實體金鑰遺失或遭竊,記得設定 PIN 碼,Gnuk 在 PIN 碼錯三次後會被鎖住,需另一組管理者 PIN 碼解鎖,若管理者密碼也連錯三次,Gnuk 便會摧毁金鑰以守住祕密,考慮得挺周到的。參考

我錄了一段影片,示範如何用實體金鑰解密檔案。操作過程會先用公開金鑰加密(公鑰是公開的,任何人都可用它加密,但只有擁有私鑰的人可以解密),解密時必須輸入 PIN 碼並按下確認鈕才能解密,且一旦拔除 USB 金鑰後就無法解密了。

USB 金鑰解密操作示範

另外,透過一些設定,GPG 金鑰也可用來登入 SSH,代表這支實體金鑰可以用來加解密、做數位簽章(還能為 Git Commit 加上簽名,發現有 Bug 出包時可為呈堂證供)及登入 SSH,應用範圍廣泛。

做到這一步對我是項重要里程碑,代表後面有一籮筐有趣的東西可以玩,像是我一直很想寫支密碼管理程式,用實體金鑰加密保存密碼,以便在登入 Windows 遠端桌面自動輸入密碼,實現方便又安全的自動登入,這些就留待未來找時間完成囉~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK