一次性密碼 (OTP) 是如何運作的?
在這篇文章中,我們將介紹兩種不同的一次性密碼方法:電子郵件/電話 + 驗證碼和動態碼。
隨著互聯網的發展,我們使用各種線上服務來滿足幾乎所有的需求。使用這些服務的第一步通常是註冊和登入。儘管自從無法連接網際網路的獨立桌面電腦時代過去已有三十多年,使用者 ID 和密碼驗證依然廣泛使用。
過去,我們可能只需記住電郵帳號的密碼,但現在我們經常使用數十、甚至數百個線上服務,而且不能為所有這些服務使用相同的密碼(如果一個帳號的密碼被洩露,所有使用相同密碼的帳號都會面臨風險)。因此,無密碼登入正在變得越來越流行,並逐漸成為主流方法。
有許多不同的無密碼認證方法,包括但不限於社交登入、電子郵件/電話 + 驗證碼、與動態密碼的認證應用程式。後兩種方法可以歸類為一次性密碼 (OTPs)。
什麼是一次性密碼 (OTP)?
一次性密碼是一段自動生成的字符序列,只對單次登入會話或短時間內有效。因為一次性密碼只能使用一次,所以可以防止憑證洩露的風險,例如密碼丟失或被盜。
理論上,一次性密碼可以是某個長度的隨機字符字符串,包括大寫和小寫字母,甚至特殊符號。但為了提升用戶體驗,大多數服務在使用一次性密碼時使用純數字。
電子郵件 / 電話 + 驗證碼
許多網站要求你通過向你註冊的電子郵件或電話號碼發送驗證碼(或通行碼)來驗證你的身份。
想像一下,傑克和喬在玩一個猜數字的遊戲,傑克想了一個 0 到 999 之間的數字, 並給喬三次機會在一分鐘內猜出數字。除了知道數字的範圍,喬沒有其他資訊。
我們都知道,喬在一分鐘內只能通過三次嘗試幾乎不可能正確猜出數字。
電子郵件 / 電話 + 驗證碼的工作原理是相同的:驗證碼通常只在極短時間內有效,通常不超過 10 分鐘(類似於傑克給喬 "一分鐘" 來猜數字)。此外,用於驗證驗證碼的 API 或方法通常設有速率限制以防止暴力破解通行碼(像傑克只給喬 "三次機會")。
對潛在攻擊者來說,幾乎不可能破解這種方法。然而,系統通過可信賴的渠道(電子郵件或電話)告訴使用者驗證碼,使使用者能夠直接驗證。
動態碼
動態碼,也稱為基於時間的一次性密碼 (TOTP),因為它會隨時間的變化而改變而被稱為 "動態"。通常,如果一個 web 應用程式使用 TOTP,就會遵循 RFC6238 - TOTP: 基於時間的一次性密碼算法。
基於散列的一次性密碼
在介紹 TOTP 前,我們需要簡單解釋 RFC4226 - HOTP: 基於 HMAC 的一次性密碼算法(HMAC 是一種 散列算法)。HOTP 算法的工作原理如下:
-
秘密:HOTP 需要一個共享的密鑰 K,伺服器和客戶端是相同的。
-
計數器:HOTP 的核心是一個計數器 C,每次生成一個新密碼時都會遞增。
-
HMAC 計算:
-
使用 HMAC-SHA-1(或其他哈希函數)來計算認證碼:
-
這裡,H 是一個 160 位的哈希值。
-
-
截斷:提取哈希值 H 的一部分以生成 OTP。假設我們需要一個 6 位的 OTP,流程如下:
- 提取 H 的最後一個字節作為截斷偏移量 O。
- 從 O 開始提取 4 個字節並將它們轉換為一個整數 T。
- 取 T 的最後 d 位數字,即 OTP = T 模 10^d。
綜上所述,HOTP 公式為:
其中 d 是所需的 OTP 長度(通常為 6-8 位數字)。
基於時間的一次性密碼
TOTP 是 HOTP 的一種擴展,在這裡計數器被時間步長替代。它使用當前時間生成動態驗證碼,因此 OTP 會隨時間自動過期。其工作原理如下:
-
時間步長:TOTP 使用當前時間 T 替代 HOTP 計數器 C。時間步長是一個固定的時間間隔(通常為 30 秒)。
- 例如,假設時間步長為 30 秒,而當前 Unix 時間戳為 T。TOTP 計數器計算為:T' = T / time_step
- 其中 T' 是時間步長計數器,單位為 30 秒。
-
生成 OTP:將 T' 替入 HOTP 算法以生成 OTP:
-
動態更新:因為 TOTP 基於時間步長,所以 OTP 隨時間改變,只要 OTP 在有效時間窗口內,伺服器就可以驗證其有效性。
總結來說,TOTP 公式為:
根據我們使用認證應用程式 的經驗,我們可以通過掃描 QR 碼或直接複製粘貼來同步設備和伺服器之間的秘密值,然後需要輸入當前動態碼一次以確保秘密值相同。
在移動設備早期的使用過程中,我們可能會發現不同設備上的時間不一致,並需要定期手動調整設備時間。近年來,幾乎所有設備都使用網路時間服務 (NTP) 來定期同步更新設備時間。即使設備的時鐘不完全準確,頻繁的更新也能確保不同設備上的時間基本一致。基於這個假設,即使設備離線,動態碼仍然可以使用,而在離線狀態下接收驗證碼會比較困難。
結尾
在這篇文章中,我們介紹了兩種不同的一次性密碼方法:電子郵件/電話 + 驗證碼和動態碼。
電子郵件/電話 + 驗證碼依賴於通信基礎設施和第三方電子郵件或短訊服務 (SMS) 實施;動態碼不依賴外部服務和通信設施,並且可以在離線環境中使用。
Logto 作為一個受歡迎、強大且高度可擴展的 IAM(身份和訪問管理)服務,同時支持這兩種 OTP 方法,允許用戶從業務角度選擇最適合自己需求的方案。