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

於是,出現許多補強或替代密碼的手段,像是指紋、臉部識別、晶片卡、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 元左右)。參考

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


照片來源

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

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

自然人憑證能做的事有限,像是不能拿來登入 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 後,再插上電腦會變成一台讀卡機加智慧卡,可以拿來存入金鑰,當成實體金鑰使用。

不過,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 遠端桌面自動輸入密碼,實現方便又安全的自動登入,這些就留待未來找時間完成囉~


Comments

# by 小雞

問個笨問題 這種情況如果隨身碟壞了怎麼處理

# by 猛虎

鑰匙一開始就要打兩隻,免得搞丟。

# by Jeffrey

to 小雞, 金鑰跟資料一樣也需要備份,不然出問題只能怪自己。 建立金鑰的 SOP 其實是這樣的,先在電腦產生金鑰,建議先存一份到安全的離線媒體(甚至轉成PEM格式印成紙本),將金鑰存入一到多支實體金鑰(多打幾支鑰匙的概念,此時雞排金鑰就有優勢了),最後將電腦上的私鑰檔案刪除,大功告成。

# by Otto

請問,可以做類似古早KEYPRO的功能嗎? 但前端換成 .NetCore 7 WASM,來不定檢查使用者的電腦 dongle 資訊! 謝謝!

# by Jeffrey

to Otto,技術上絕對可行,最省力的方法是借用 GPG 協定傳一段隨機訊息要求用 USB Key 簽章,再用公鑰驗證簽章有效,確認使用者持有 USB Key 硬體。程式開發就要自己費心了。另一個方向是走 WebAuthn/FIDO2 方式,USB Key 要改刷 FIDO2 軟體 https://yanx.net/open-source-security-hardware

# by ByTim

我買了兩把YubiKey,最近在想要不要買個TYPE-C版的,不然有時轉接接觸不良,一直不讓我登入。

# by 小雞

好,我誤會了 我以為解密的金鑰連硬體也會認XD 想說這種加密只認單一個硬體+金鑰會不會太過冒險 XD

# by 70

to Jeffrey 如果刷這個不知道可不可行 https://github.com/gl-sergei/u2f-token

# by Jeffrey

to 70,可行,照片:https://www.thingiverse.com/thing:3499355 (URL 數字部分要手動選取) 但用途不同,u2f-token 可支援 Gmail/FB 的多因素認證,我刷 Gnuk 主要用來整合 GPG 做加解密跟登入 SSH

# by sparek

可以參考這個產品 https://www.themooltipass.com/setup/

# by Jeffrey

to sparek,感覺蠻有趣的,感謝分享。(開始思考怎麼土砲出類似的外掛)

# by spark

它功能蠻完整的, 可以模擬成鍵盤輸入帳密(有些公司要求每3個月換一次密碼這真是救星),也有fido2... 還是open source ...XD GitHub https://github.com/mooltipass/moolticute User Manual https://raw.githubusercontent.com/mooltipass/minible/master/MooltipassMiniBLEUserManual.pdf

# by Andyching168

想問問 這個支援Windows Hello的登入嗎 還有Edge的金鑰驗證

Post a comment


64 + 30 =