TOTP 運作原理:揭秘雜湊函數與時間同步的魔法
2024-09-16 11:12:29

TOTP 運作原理:揭密雜湊函數與時間同步的協奏曲

你是否好奇過,當你打開二步驗證應用程式時,那個每 30 秒會變化的 6 位數字是如何生成的?今天,我們將揭開 TOTP(基於時間的一次性密碼)的神秘面紗,深入探討這個表面看似簡單但實際上深具威力的安全技術。

什麼是 TOTP?為什麼需要它?

在深入技術細節之前,讓我們先探討一下,為什麼 TOTP 在現代網路安全中佔有如此重要的地位。隨著越來越多的個人數據上網,單憑密碼的保護已經遠遠不夠。即使你使用再高強度的密碼,黑客通過釣魚網站、惡意軟件或社交工程也能獲取你的密碼。一旦你的密碼被盜,攻擊者就能輕易登入你的帳戶——這是每個人最不樂見的。

二步驗證(2FA)因此應運而生。它是在密碼之外增添的一道防線,可確保即使密碼被洩露,仍需要通過第二步的驗證才能登入帳號。而 TOTP 是 2FA 中最常見且已被廣泛採用的一種方式。

TOTP 是 “Time-based One-Time Password” 的縮寫,中文稱為「基於時間的一次性密碼」。顧名思義,它根據時間生成一次性密碼,並且每過一段時間(通常為 30 秒),就會生成一個新的 6 位數組合。

TOTP 的秘密配方:時間 + 秘密 + 雜湊 = 安全

讓我們來看看 TOTP 背後的具體運作機制,並揭開時間同步與雜湊函數如何共同運作來保護帳戶:

  1. 共享的秘密:你的裝置和服務器之間共享一個秘密金鑰(通常是在你初次設置驗證器應用時掃描的 QR 碼中隱含的碼)。
  2. 時間同步:當前時間是生成密碼時的關鍵因素。簡單來說,TOTP 的構造都基於時間的變化,因此每隔一段固定的時間(例如 30 秒或 60 秒),會生成一個新的密碼。
  3. 雜湊函數:為了保證安全性,我們使用一種稱作「雜湊函數」的算法來將時間和秘密金鑰綜合處理後,生成一個看似隨機的數字。背後的核心函數通常是 HMAC-SHA1。

雜湊函數:TOTP 的核心技術

雜湊函數是 TOTP 安全設計的核心,它具有以下特點:

  1. 單向性:一旦生成了雜湊結果,便無法從結果逆向推出原始輸入,即便攻擊者獲得了某些密碼,也無法輕易重建出雜湊過程中的密鑰或時間等參數。
  2. 一致性:對相同輸入應用雜湊函數時,總會生成相同的輸出。這確保當設備和服務器處理相同的時間和金鑰時,能得出一致的驗證碼。
  3. 雪崩效應:即使原始輸入的變化極其微小,變化後的輸出結果也將全然不同。時間僅需變動 milliseconds(毫秒),生成的密碼就會徹底變化。

深入 TOTP 的計算過程

graph TD
    A[共享密鑰 Key] --> B[客戶端]
    A --> C[服務器]
    
    B --> D[獲取當前時間戳]
    D --> E[TOTP 算法]
    A --> E
    E --> F[生成 6 位數驗證碼]
    
    C --> G[獲取當前時間戳]
    G --> H[TOTP 算法]
    A --> H
    H --> I[生成 6 位數驗證碼]
    
    F --> J[用戶輸入驗證碼]
    J --> K[發送到服務器]
    
    K --> L{比較驗證碼}
    I --> L
    
    L -->|匹配| M[驗證成功]
    L -->|不匹配| N[驗證失敗]

現在我們將深入了解 TOTP 的計算機制。這可能看起來繁瑣,但如果你一步一步來,就會發現這一技術實際上是既簡單又優雅的。

步驟 1:計算時間步數(Time Step)

  1. 獲取 UNIX 時間戳:我們首先獲取當前的 UNIX 時間戳,也就是從 1970 年 1 月 1 日 00:00:00 起至現在所經過的秒數。
  2. 選擇時間步長:TOTP 通常以 30 秒為時間步伐,也就是每 30 秒就會生成一個新的密碼。但在某些系統中,這個時間步長可能會設為 60 秒。
  3. 求整數時間步數:我們將當前的 UNIX 時間戳除以時間步長,並取整數部分。

公式如下:

1
T = floor(當前 UNIX 時間戳 / 30)

例如,當 UNIX 時間戳是 1652345678 時:

1
T = floor(1652345678 / 30) = 55078189

這代表現在處於第 55078189 個時間步內。

步驟 2:準備密鑰

  1. 提取共享金鑰:在用戶設置 TOTP 驗證器應用時,通常通過 QR 碼或手動輸入的方式將用戶與伺服器共享一個基於 Base32 編碼的秘密金鑰。
  2. 解碼金鑰:這個 Base32 編碼的金鑰需要解碼成原始的二進制數據,這才是後面運算需要的真正密鑰。

例如,共享金鑰「JBSWY3DPEHPK3PXP」解碼後會變成一串 16 字節的二進制數據。

步驟 3:應用 HMAC-SHA1 函數

  1. 轉換步數時間為二進制:把步驟 1 中計算出的 T(時間步數)轉換為一個 8 字節的二進制數據,向 HMAC 函數中傳遞。
  2. 計算 HMAC-SHA1:使用金鑰和步數作為輸入,應用 HMAC-SHA1 (一種以 SHA1 哈希函數為基礎構建的消息認證碼算法)。輸出的結果是 20 字節(160 位)長度的數據。

步驟 4:動態截斷(Dynamic Truncation)

  1. 最後一個字節定位:從 HMAC 輸出的最後一個字節,取低 4 位來確定位置偏移(0 到 15 之間)。
  2. 取出部分輸出結果:從這個偏移位置開始,提取 4 個字節的數據,並將其轉換為一個長度 31 位的整數(這一步避免符號運算問題)。

例如,如果 HMAC 的最後一個字節是 0x5a,那麼:

1
偏移位置 = 0x5a 的低 4 位 = 10

然後從 HMAC 的第 10 個字節提取 4 個字節數據。

步驟 5:生成 6 位數的 TOTP 密碼

  1. 取餘數:將步驟 4 所得的 31 位整數結果對 1,000,000 取模,確保產生的數字為 6 位數。
  2. 補全 0:如果結果少於 6 位,則在前面補上 0。

數學公式如下:

1
TOTP = str(31 位整數 % 1000000).zfill(6)

假設步驟 4 的計算結果是 54321098,那麼:

1
TOTP = str(54321098 % 1000000).zfill(6) = "321098"

為什麼 TOTP 安全?

TOTP 之所以被廣泛應用,背後有幾個重要的原因:

  1. 短暫的有效期:每個密碼最多僅在30秒(或時間步長)內有效,意味著即使攻擊者獲得了這個密碼,必須在極短的時間內使用它,這大大降低了風險。
  2. 秘密不可逆:由於雜湊函數的單向性,即使對方截獲了某個密碼,也無法通過密碼推導出你的金鑰或是其他步驟的計算過程。
  3. 本地計算,不依賴網絡:TOTP 密碼完全是在用戶的設備上生成,不需要與服務端進行實時通訊,這意味著攻擊者無法通過網路截取這些密碼。

TOTP 的應用範例

graph TD
    A[TOTP應用場景] --> B[網上銀行]
    A --> C[企業VPN]
    A --> D[雲服務]
    A --> E[密碼管理器]
    A --> F[社交媒體]
    B --> G[交易確認]
    C --> H[員工遠程訪問]
    D --> I[保護用戶帳戶]
    E --> J[額外安全措施]
    F --> K[帳號保護]

TOTP 被廣泛應用於各種需要檢驗用戶身份的場景,尤其是在需要提高安全性的場合:

  1. 銀行與金融服務:許多在線銀行和支付平台均採用 TOTP 作為交易驗證的額外防護層。
  2. VPN 保護:公司常使用 TOTP 來驗證遠程員工的權限,確保只有合法用戶可以進入公司內部網絡。
  3. 雲端服務:例如 AWS 或 Google Cloud 等提供 TOTP 驗證器支援,用來保護管理後台的登入。
  4. 社交媒體:Instagram、Twitter、Facebook 等社交平台重視帳號安全,提供使用 TOTP 的二步驗證選項。
  5. 密碼管理工具:許多密碼管理應用,如 1Password 和 LastPass,都支援內部生成 TOTP 密碼,進一步加強金鑰安全。

總結:時間與密碼學的結合藝術

TOTP 將密碼學與時間的概念完美結合,以一個巧妙的過程大幅提升我們日常數字帳戶的安全性。它不需要額外的硬件設備,只需一個能生成 TOTP 密碼的應用程式,就能提供比單純的密碼驗證更強大的安全保障。

下次當你看到不斷變化的 6 位數字時,別忘了背後這一套精妙的機制。啟動二步驗證,將時間與密碼學編織出的盾,牢牢守護你的數位財產吧!

Prev
2024-09-16 11:12:29
Next