基於時間的一次性密碼算法
基於時間的一次性密碼算法(英語:Time-based One-Time Password,簡稱:TOTP)是一種根據預共享的密鑰與當前時間計算一次性密碼的算法。它已被互聯網工程任務組接納為RFC 6238標準[1],成為主動開放認證(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 10d,d 是所需的一次性密碼的位數。
實現
編輯根據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]
一旦參數協商完畢,密碼開始按照如下方法生成:
- 從T0開始已經過的時間,每個TI為一個單位,總數記為C。
- 使用C作為消息,K作為密鑰,計算HMAC哈希值H(定義來自之前的HMAC算法,但是大部分加密算法庫都有支持)。K應當保持原樣繼續傳遞,C應當以64位的原始無符號的整形數值傳遞。
- 取H中有意義最後4位數的作為彌補,記為O。
- 取H當中的4位,從O字節MSB開始,丟棄最高有效位,將剩餘位儲存為(無符號)的32位整形數值I。
- 密碼即為基數為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標準的一部分。
參見
編輯參考文獻
編輯- ^ RFC 6238 - TOTP: Time-Based One-Time Password Algorithm. [2011-07-13]. (原始內容存檔於2021-01-05).
- ^ KeyUriFormat. [2014-08-05]. (原始內容存檔於2014-12-30).
- ^ Zetter, Kim. RSA Agrees to Replace Security Tokens After Admitting Compromise. WIRED. [2017-02-17]. (原始內容存檔於2020-11-12) (美國英語).
- ^ Alexander, Madison. OATH Submits TOTP: Time-Based One Time Password Specification to IETF. Open Authentication. [2010-02-22]. (原始內容存檔於2013-01-23).