PKCS#11 OTP - 硬體安全模組中的一次性密碼標準

在數位安全的領域中,雙因素認證(Two-Factor Authentication, 2FA)已成為保護帳戶和敏感資料的基礎。

其中,一次性密碼(One-Time Password, OTP)是最常見的實現方式之一。為了將這種強大的認證機制標準化並整合到硬體安全模組(HSM)和智慧卡等加密設備中,PKCS#11 標準引入了對 OTP 的支援。本文將根據相關技術文件,深入探討 PKCS#11 OTP 的核心概念、運作機制及其重要性。

本文將探討 PKCS#11 中 OTP 的整合,並介紹其核心運作機制。

什麼是 PKCS#11?

PKCS#11,全名為「Public-Key Cryptography Standards #11」,是由 RSA 實驗室制定的一套標準 API,又稱為 Cryptoki

它定義了一個平台獨立的應用程式介面,用於與加密權杖(Cryptographic Token,如 HSM、智慧卡或 USB Key)進行互動。透過這套標準,應用程式無須關心底層硬體設備的具體實現,即可執行金鑰管理、加密、解密、數位簽章等密碼學操作。index image

PKCS#11 中的 OTP 整合

隨著 OTP 技術的普及,PKCS#11 標準(自 v2.3 草案起,並在 v2.4 正式納入)也將其納入規範,定義了在加密權杖中生成和驗證 OTP 的標準化方法。這使得 OTP 金鑰可以安全地儲存在硬體中,防止被輕易竊取或複製,從而大幅提升了認證的安全性。

根據標準,PKCS#11 支援多種類型的 OTP,以應對不同的應用場景:

  • 計數型 OTP (Counter-Based OTP, HOTP): 以事件計數器為基礎,每次生成密碼後,計數器加一。伺服器端和客戶端需要保持計數器同步。
  • 時間型 OTP (Time-Based OTP, TOTP): 以時間為變數,通常每 30 或 60 秒生成一個新的密碼。這是目前最主流的方式,例如 Google Authenticator。
  • 挑戰-回應型 OTP (Challenge-Based OTP): 伺服器發送一個隨機的「挑戰值」,客戶端使用該挑戰值和預存的金鑰來生成一次性密碼。
  • PIN 碼型 OTP (PIN-Based): 在生成 OTP 的過程中,需要使用者輸入個人識別碼(PIN),為認證過程增加另一層保護。

核心運作機制

PKCS#11 透過定義一組特定的函式、參數和物件屬性來實現 OTP 功能。

1. 主要函式 (Mechanisms)

  • C_GenerateKey(): 用於在權杖內部生成一個 OTP 金鑰物件 (CKO_OTP_KEY)。不同的 OTP 類型有對應的生成機制,例如 CKM_HOTP_KEY_GEN 用於生成 HOTP 金鑰。
  • C_Sign(): 在使用者端(Client-side)呼叫此函式來「簽署」一個操作,從而生成 OTP 值。雖然名為 Sign,但其本質是執行 OTP 演算法,並輸出一個包含 OTP 資訊的結構 CK_OTP_SIGNATURE_INFO
  • C_Verify(): 在伺服器端(Server-side)呼叫此函式,用以驗證使用者提交的 OTP 值 (CK_OTP_VALUE) 是否有效。

2. 金鑰物件屬性 (Attributes)

除了標準的私密金鑰屬性外,OTP 金鑰物件還包含一系列專屬屬性,用以定義其行為:

  • CKA_OTP_FORMAT: 定義 OTP 的輸出格式(如純數字、十六進位、英數字元等)。
  • CKA_OTP_LENGTH: OTP 的長度,例如 6 位或 8 位。
  • CKA_OTP_*_REQUIREMENT: 定義生成 OTP 時是否必須提供挑戰值、時間、計數器或 PIN 碼。
  • CKA_OTP_COUNTER: 對於 HOTP,此屬性儲存目前的計數器值。
  • CKA_OTP_TIME: 對於 TOTP,此屬性定義了時間間隔(Time Interval)。

3. 硬體特性物件 (Hardware Feature Objects)

為了確保 OTP 生成的可靠性,PKCS#11 標準還定義了硬體特性物件,讓應用程式可以直接存取權杖的底層硬體功能。這對於 OTP 的實現至關重要:

  • CKH_CLOCK: 提供一個安全的硬體時鐘。對於時間型 OTP (TOTP),應用程式可以信賴此時鐘來獲取準確的時間,避免因客戶端系統時間被竄改而導致的安全風險。
  • CKH_MONOTONIC_COUNTER: 提供一個單調遞增且防竄改的硬體計數器。對於計數型 OTP (HOTP),此計數器確保了每次生成的密碼都是基於一個新的、唯一的計數器值,從而防止重放攻擊。

系統導入注意事項

在將 PKCS#11 OTP 整合到系統中時,有幾個關鍵點需要特別注意:

  1. 同步機制: 對於計數型(HOTP)和時間型(TOTP)的 OTP,客戶端和伺服器之間的計數器或時間必須保持同步。需要設計合理的漂移(Drift)管理和重新同步(Resynchronization)機制。
  2. 鎖定與重置: 應考慮使用者連續輸入錯誤後的帳號鎖定策略,並提供安全可靠的線上或臨櫃重置流程。
  3. 安全通道: OTP 應作為雙因素認證中的一個因素,並在安全的通訊協定(如 TLS/SSL)中傳輸,以防止重放攻擊(Replay Attack)或會話劫持(Session Hijacking)。
  4. 裝置綁定: 一般而言,不應允許多個裝置共用同一組 OTP 金鑰,以確保認證的唯一性。

關聯標準與延伸

PKCS#11 OTP 的設計與多個業界主流的 RFC 標準緊密相關,包括:

  • RFC 4226 (HOTP): 定義了計數型 OTP 的演算法。
  • RFC 6238 (TOTP): 定義了時間型 OTP 的演算法。
  • RFC 6287 (OCRA): 定義了更複雜的挑戰-回應演算法。
  • RFC 6030 (PSKC): 定義了一個基於 XML 的標準格式,用於安全地交換和配置 OTP 金鑰資料。

結論

PKCS#11 OTP 為高安全性的雙因素認證提供了一個標準化且可靠的硬體層解決方案。它不僅將 OTP 金鑰安全地儲存在加密權杖中,還統一了不同類型 OTP 的操作介面,並利用底層的硬體特性確保時間與計數器的可信度,讓開發者能夠更輕鬆地將強認證機制整合到各種應用程式中。隨著對數位身份安全要求的日益提高,基於硬體的 PKCS#11 OTP 標準無疑在構建可信賴的數位環境中扮演著至關重要的角色。

參考資料

  • HOTP: An HMAC-Based One-Time Password Algorithm
  • TOTP: Time-Based One-Time Password Algorithm
  • OCRA: OATH Challenge-Response Algorithm

也許你也會想看看