基於時間的一次性密碼演算法

驗證算法

基於時間的一次性密碼演算法(英語:Time-based One-Time Password,簡稱:TOTP)是一種根據預共用的金鑰與當前時間計算一次性密碼演算法。它已被互聯網工程任務組接納為RFC 6238標準[1],成為主動開放認證英語Initiative For Open Authentication(OATH)的基石,並被用於眾多多重要素驗證系統當中。

TOTP是雜湊訊息鑑別碼(HMAC)當中的一個例子。它結合一個私鑰與當前時間戳,使用一個密碼雜湊函數來生成一次性密碼。由於網絡延遲與時鐘不同步可能導緻密碼接收者不得不嘗試多次遇到正確的時間來進行身份驗證,時間戳通常以30秒為間隔,從而避免反覆嘗試。

在特定的多重因素驗證應用中,用戶驗證步驟如下:一位用戶在網站或其他伺服器上輸入用戶名和密碼,使用執行在本地的智能電話或其他裝置中的TOTP生成一個一次性密碼提交給伺服器,並同時向伺服器輸入該一次性密碼。伺服器隨即執行TOTP並驗證輸入的一次性密碼。為此,用戶裝置與伺服器中的時鐘必須大致同步(伺服器一般會接受客戶端時間-1區間(也就是延遲了30秒)的時間戳生成的一次性密碼)。在此之前,伺服器與用戶的裝置必須通過一個安全的信道共用一個金鑰,用於此後所有的身份驗證對談。如需要執行更多步驟,用戶也可以用TOTP驗證伺服器。

定義

TOTP基於HOTP,附帶的時間戳用於替代遞增計數器。

通過定義一個紀元(epoch, T0)的起點並以時間步驟(time step, TS)為單位進行計數,當前時間戳被轉換成一個整形數值的時間計數器(time-counter, TC)。舉一個例子:

TC = 最低值((unixtime(當前時間)−unixtime(T0))/TS),
TOTP = HOTP(金鑰, TC),
TOTP-值 = TOTP mod 10dd 是所需的一次性密碼的位數。

實現

根據RFC 6238標準,供參考的實現如下:

  • 生成一個任意位元組的字串金鑰K,與客戶端安全地共用。
  • 基於T0的協商後,Unix時間從時間間隔(TI)開始計數時間步驟,TI則用於計算計數器C(預設情況下TI的數值是T0和30秒)的數值
  • 協商加密雜湊演算法(預設為HMAC-SHA-1
  • 協商密碼長度(預設6位)

儘管RFC 6238標準允許使用不同的參數,Google開發的驗證應用不允許不同於預設的T0、TI值、雜湊方法和密碼長度。RFC 3548也同時鼓勵K金鑰以base-32編碼輸入(或以QR碼的形式提供)。[2]

一旦參數協商完畢,密碼開始按照如下方法生成:

  1. 從T0開始已經過的時間,每個TI為一個單位,總數記為C。
  2. 使用C作為訊息,K作為金鑰,計算HMAC雜湊值H(定義來自之前的HMAC演算法,但是大部分加密演算法庫都有支援)。K應當保持原樣繼續傳遞,C應當以64位元的原始無符號的整形數值傳遞。
  3. 取H中有意義最後4位元數的作為彌補,記為O。
  4. 取H當中的4位元,從O位元組MSB開始,丟棄最高有效位,將剩餘位儲存為(無符號)的32位元整形數值I。
  5. 密碼即為基數為10的最低N位數。如果結果位數少於N,從左邊開始用0補全。

伺服器與客戶端都會計算密碼,但是由伺服器來檢查客戶端提供的密碼是否匹配伺服器本地生成的密碼。考慮到輕微的時鐘偏移、網絡延遲或用戶延誤等情況,有些伺服器允許接受本應該在早先已生成或稍後才生成的密碼。

弱點和缺陷

儘管攻擊者需要即時寄存憑證,而不能之後收集,但是TOTP代號跟密碼一樣可能被釣魚。

不限制登入嘗試的TOTP實現容易被暴力破解,因此嘗試次數限制必須非常少。

竊取到預共用金鑰的攻擊者可以隨意生成新的非法的TOTP代號。如果攻擊者攻破大型的認證資料庫,這就會是個問題。[3]

由於TOTP裝置可能會發生電力用盡、時鐘不同步等情況,用戶手機上的軟件也可能遺失或失竊,所有現存的實現都可以繞開相應保護(如:列印的代碼、電子郵件重設等),這對於大型用戶群支援來說是個負擔,並給了欺詐用戶更多的操作空間。

TOTP代號的有效期會長於螢幕上顯示的時間(通常是2倍或更長)。這是對認證雙方的時鐘可能有較大幅度偏移而作出的讓步。

所有基於一次性密碼的認證方案(包括TOTP、HOTP和其他方案)都會暴露於連線劫持當中,比如可以在登入後強徵用戶的對談。

儘管如此,TOTP仍然比單獨使用傳統靜態密碼驗證的安全性強很多。上述的一些問題也可以通過簡單的方法解決(比如為防止暴力破解,可以增加TOTP的位數,或者使用多個TOTP同時驗證)。

歷史

TOTP草案由數碼OATH成員合作開發,目的是建立一個行業通用標準。它完善了基於事件的一次性標準HOTP,並為終端用戶組織和企業在選擇最適合的應用要求與安全規範技術提供了更多選擇。2008年,OATH向IETF提交了一份草案規範。這一版本的草案以之前提交的版本為基礎,包含作者從技術社區收到的全部反饋與評論。[4]2011年5月,TOTP正式成為RFC 6238標準的一部分。

參見

參考文獻

  1. ^ RFC 6238 - TOTP: Time-Based One-Time Password Algorithm. [2011-07-13]. (原始內容存檔於2021-01-05). 
  2. ^ KeyUriFormat. [2014-08-05]. (原始內容存檔於2014-12-30). 
  3. ^ Zetter, Kim. RSA Agrees to Replace Security Tokens After Admitting Compromise. WIRED. [2017-02-17]. (原始內容存檔於2020-11-12) (美國英語). 
  4. ^ Alexander, Madison. OATH Submits TOTP: Time-Based One Time Password Specification to IETF. Open Authentication. [2010-02-22]. (原始內容存檔於2013-01-23).