繁體中文(香港)
  • passwordless
  • one-time password
  • otp
  • time-based otp
  • hash-based otp

一次性密碼 (OTP) 是如何運作的?

在這篇文章中,我們將介紹兩種不同的一次性密碼方法:電子郵件/電話 + 驗證碼 和 動態密碼。

Darcy Ye
Darcy Ye
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

隨著互聯網的發展,我們使用了各種在線服務來滿足我們幾乎所有的需求。使用這些服務的第一步通常是註冊和登入。談到註冊和登入,即使距離使用無法連接互聯網的獨立台式電腦的時代已經過去了三十多年,用戶 ID 和密碼驗證仍然被廣泛使用。

在過去,我們可能只需要記住我們的電子郵件帳戶密碼,但現在我們經常使用數十甚至上百種在線服務,因此不能為所有服務使用相同的密碼(如果一個帳戶的密碼洩露,所有使用相同密碼的帳戶都會處於風險中)。因此,無密碼登入變得越來越流行,並逐漸成為主流的方法。

有許多不同的無密碼身份驗證方法,包括但不限於社交登入、電子郵件/電話 + 驗證碼,以及使用驗證器應用程式的動態密碼。後兩種方法可以歸類為一次性密碼 (OTPs)。

什麼是一次性密碼 (OTP)?

OTP 是一個自動生成的字符序列,只對單次登入會話或短時間內有效。因為 OTP 只能使用一次,所以可以防止憑證洩漏的風險,例如丟失或被盜的密碼。

理論上,OTP 可以是某特定長度的隨機字符串,包含大寫和小寫字母,甚至是特殊符號。但為了用戶體驗,大多數服務在使用 OTP 時會使用純數字。

電子郵件 / 電話 + 驗證碼

許多網站要求你通過向你註冊的電子郵件或電話號碼發送驗證碼(或密碼)來驗證你的身份。

想像一下,Jack 和 Joe 在玩猜數字遊戲,Jack 想出一個介於 0 到 999 之間的數字,並給 Joe 三次機會在一分鐘內猜對這個數字。除了知道數字的範圍,Joe 沒有其他資訊。

我們都知道,Joe 幾乎不可能在一分鐘內用三次嘗試就正確猜出這個數字。

電子郵件 / 電話 + 驗證碼基於相同的原理:驗證碼的有效期通常非常短,通常不超過 10 分鐘(類似於 Jack 給 Joe「一分鐘」猜數字)。此外,用於驗證驗證碼的 API 或方法通常設有速率限制以防止對密碼進行暴力攻擊(就像 Jack 只給 Joe「三次機會」)。

對於潛在的攻擊者來說,幾乎不可能破解這種方法。然而,系統通過受信任的渠道(電子郵件或電話)告訴用戶驗證碼,允許用戶直接驗證。

動態密碼

動態密碼,也稱為基於時間的一次性密碼 (TOTP),因為它會隨時間變化而「動態」更改。通常,如果 Web 應用程式使用 TOTP,將會遵循 RFC6238 - TOTP 的基於時間的一次性密碼演算法

基於哈希的一次性密碼

在介紹 TOTP 之前,我們需要簡要說明 RFC4226 - HOTP 的基於 HMAC 的一次性密碼演算法(HMAC 是一種哈希演算法)。HOTP 演算法的工作原理如下:

  1. 秘密:HOTP 需要一個共享的秘密金鑰 K,這在伺服器和客戶端之間是相同的。

  2. 計數器:HOTP 的核心是一個計數器 C,每當生成新密碼時,這計數器就會增加一次。

  3. HMAC 計算:

    • 使用 HMAC-SHA-1(或其他雜湊函數)來計算驗證碼:

      hmac calculation
    • 其中,H 是一個 160 位的哈希值。

  4. 截斷:從哈希值 H 中提取部分以生成 OTP。假設我們要 6 位數的 OTP,過程如下:

    • 提取 H 的最後一個字節作為截斷偏移量 O。
    • 從 O 開始提取 4 個字節,轉換成一個整數 T。
    • 取 T 的最後 d 位數字,即 OTP = T mod 10^d。

總的來說,HOTP 的公式是:

hash-based otp calculation

其中 d 是所需的 OTP 長度(通常為 6-8 位數)。

基於時間的一次性密碼

TOTP 是 HOTP 的擴展,其中計數器被時間步替換。它使用當前時間來生成動態驗證碼,因此 OTP 會隨時間自動失效。其工作原理如下:

  1. 時間步:TOTP 用當前時間 T 代替 HOTP 的計數器 C。時間步是一個設定的固定時間間隔(通常為 30 秒)。

    • 例如,假設時間步為 30 秒,當前的 Unix 時間戳是 T。TOTP 計數器可以計算為:T' = T / time_step
    • 其中 T′ 是時間步計數器,以 30 秒為單位。
  2. 生成 OTP:將 T′ 代入 HOTP 演算法以生成 OTP:

    generating totp
  3. 動態更新:由於 TOTP 是基於時間步的,OTP 會隨著時間變化,因此只要 OTP 處於有效的時間窗口內,伺服器就可以驗證其有效性。

總結來說,TOTP 的公式是:

totp calculation

基於我們使用驗證器應用程式的經驗,我們可以通過掃描二維碼或直接複製粘貼來同步設備和伺服器之間的秘密值,然後我們需要輸入當前的動態密碼一次,以確保秘密值相同。

在早期使用移動設備的時候,我們可能會發現不同設備的時間不同,並需要定期手動調整設備的時間。近年來,幾乎所有設備都使用網絡時間服務 (NTP) 定期同步和更新設備時間。即使設備的時鐘不完全準確,頻繁的更新可確保不同設備上的時間合理一致。基於這個假設,動態密碼即使是在設備離線的情況下也能使用,而在離線狀態下很難收到驗證碼。

結束語

在這篇文章中,我們介紹了兩種不同的一次性密碼方法:電子郵件/電話 + 驗證碼 和 動態密碼。

電子郵件/電話 + 驗證碼依賴於通信基礎設施和第三方電子郵件或短信服務 (SMS) 實現;動態密碼不依賴於外部服務和通信設施,可以離線使用。

Logto 作為一個受歡迎的、強大的、高度拓展的 IAM (身份和訪問管理) 服務,支持這兩種 OTP 方法,允許用戶從業務角度選擇最符合其需求的解決方案。