為什麼有了 Google Authenticator 還要使用實體的 Two-Factor Token?

如標題的問題,因為 token 可以將 secret key 實體隔離開。

可以讀看看最近這篇報導:「Zitmo Trojan Variant Eurograbber Beats Two-Factor Authentication to Steal Millions」,其中這段:

To date, the researchers said, Eurograbber has infected more than 30,000 users and stolen an estimated 36 million Euros.

對於開發木馬的人,銀行服務算是「經濟效益」最高的「投資」...

用簡訊也有類似的問題,實體的 OTP 算是目前最能抵抗這類攻擊的方式了...

RSA SecurID 800 被破...

在「Scientists crack RSA SecurID 800 tokens, steal cryptographic keys」這篇報導裡提到了已經有辦法從 RSA SecurID 800 內取出 secret key,方法將會在 CRYPTO 2012 上發表...

RSA SecurID 800

(取自「RSA SecurID SID800 Authenticator Token」)

如果攻擊者可以碰觸到實體 token 並取出 secret key,他就可以準備一顆新的 token (HSM,Hardware security module) 把取出來的 secret key 灌進去,而原來的使用者不太容易會發現...

所以硬體式的 OTP 系統除了提供一次性密碼外,另外需要有能力阻擋從硬體取出 secret key 的能力。這次有能力在 13 分鐘就取出來,表示有不少辛苦事情要善後了...

如果要自己寫 TOTP 的幾個要看的東西...

整理下來:

有玩過 HMAC 的人,讀這些文件應該不難...

TOTP 在預設的情況下,其實就是 HMAC-SHA-1 後取後面 32bits,然後轉成數字取 100000 的餘數,而 TOTP 文件是架構在 HOTP 的定義上,把時間切齊 (預設 30secs) 變成整數丟進去攪和,然後特地交代要處理 2038 年超過 Int32 的 case XDDD

最後 Google 那份文件是要輸出 QR code 讓手機可以讀的方式,建議不要用網路服務產生 QR code (因為有 secret key 啊),寧可自己抓 library 建一個用...

另外 Google Authenticator 一堆東西都只能用預設值 (Currently, the XXX is ignored by the Google Authenticator implementations.),所以也沒什麼好選的,就拿預設值吧... :o

Server side 的話,至少我在 CPAN 上面看到 Authen-OATH 可以用了,用起來也很簡單 :o

Facebook 支援 OTP over SMS

Facebook 在美國開始支援 OTP over SMS:「More Ways to Stay Secure」。

在美國的手機號碼,先認證手機號碼並開啟 OTP over SMS 的功能,接下來在每次要登入時以簡訊送 "otp" 到 32665,就會收到一組 20 分鐘內有效的 token 讓你登入到 Facebook。

簡訊便宜的國家才有機會開發這種功能... :o