Contents

two factor 相關知識和工具整理

現在很多服務都要求開啟 two-factor authentication,也就是常說的 2FA。很多人第一次用 Google Authenticator 這類工具時,會直覺以為每次產生驗證碼都需要連網,但其實大多數情況下,它是靠本地演算法和時間同步在運作。

2FA 在做什麼

2FA 的概念很簡單,就是在帳號密碼之外,再多一個驗證因子。常見形式包括:

  1. 手機 App 動態碼。
  2. 簡訊驗證碼。
  3. 硬體金鑰。

這篇主要聚焦在最常見的動態密碼,也就是 OTP 類型。

HOTP 與 TOTP

常見的一次性密碼大致可以分成兩類:

HOTP

HOTP 是基於計數器的演算法,每次往下算一個新值。

TOTP

TOTP 是基於時間的演算法,通常每 30 秒換一次碼。Google Authenticator 這類工具主要就是走這條路。

為什麼手機沒網路也能生出碼

因為重點不是向伺服器即時索取,而是手機和伺服器雙方都持有同一份 secret,再依照相同演算法和當前時間推算出相同結果。

像 QR Code 裡面通常會帶這類資訊:

1
otpauth://totp/example.com:john?algorithm=SHA1&digits=6&issuer=example.com&period=30&secret=EI6UXYUKSLSMKVQTTRS474MHUTFV4UPTANXYOZV3IME7K7GQ3UDA

只要:

  1. secret 一致。
  2. 演算法一致。
  3. 時間差沒有太離譜。

手機就算離線也能算出正確的驗證碼。

常見工具

手機端最常見的大概有:

  1. Google Authenticator
  2. Authy
  3. Microsoft Authenticator

另外,如果你拿得到 secret,其實也能用 CLI 工具或腳本在本機產生 TOTP,這對自動化測試或研究機制時很方便。不過這類做法也代表 secret 暴露風險要更小心。

安全上要注意的事

1. secret 比驗證碼本身更重要

只要 secret 洩漏,別人就能持續算出你的動態碼。

2. 備份碼要留好

很多服務在啟用 2FA 時會給 recovery code,這不是裝飾品。手機遺失或換機時,它常常是救命用的。

3. 時間同步很重要

TOTP 很依賴時間,手機時間若差太多,驗證碼就可能失效。

小結

2FA 看起來只是多打一組六位數,但背後其實是建立在 shared secret 與時間同步上的驗證機制。理解 HOTP、TOTP 和 secret 的角色後,不只比較能安心使用,也比較知道在備份、換機和自動化場景下該注意哪些風險。

相關工具

後來發現除了用手機APP,其實拿到金鑰也能產生,這邊就不研究了。有回來操作再補。

ssh - Is there a command line two-factor authentication verification code generator? - Server Fault

2016台網中心電子報

Your Time-based One time passwords from your terminal | by Jean-Thierry Bonhomme | Medium

totp-cli | TOTP CLI tool written in Go.