PKCS#5 PBKDF:從密碼中提煉安全的金鑰

在資訊安全的領域中,如何將使用者容易記憶的密碼,轉換為加密演算法所需的安全金鑰,是一項重要的課題。為此,PKCS#5 標準定義了基於密碼的金鑰派生函數(Password-Based Key Derivation Function, PBKDF),旨在從一個密碼中安全地產生金鑰。

PBKDF 屬於金鑰派生函數(Key Derivation Function, KDF)的一種。其核心目的,是透過一系列的運算,將相對不安全的密碼,轉換成具備足夠安全強度的金鑰,以抵禦暴力破解等攻擊手段。目前,業界廣泛使用的是 PBKDF2,而其前身 PBKDF1 已不再建議使用。

本文將探討 PBKDF2 的運作原理、與 PBKDF1 的差異,以及其在現代密碼學中的應用。

深入了解 PBKDF2 的運作原理

PBKDF2 透過引入兩個關鍵元素:「鹽(Salt)」和「迭代次數(Iteration Count)」,大幅提升了金鑰的安全性。其運作流程如下:

  1. 輸入參數
    • 密碼(Password):使用者設定的密碼。
    • 鹽(Salt):一組隨機產生的數據,用來防止駭客使用預先計算好的「彩虹表」進行攻擊。
    • 迭代次數(c):重複執行核心雜湊運算的次數,次數越高,破解的成本就越高。
  2. 核心函數 F:
    PBKDF2 的核心在於一個函數 F,此函數透過一個偽隨機函數(Pseudorandom Function, PRF),例如 HMAC-SHA1,對密碼和鹽值進行多次重複運算。其計算方式為:
    • 第一次運算 $U_1$ 是將密碼與(鹽值和一個計數器)作為 PRF 的輸入。
    • 後續的運算 $U_2$ 到 $U_c$ 則是將前一次的輸出結果 $U_{i-1}$ 再次作為 PRF 的輸入。
    • 最後將這 c 次的運算結果全部進行互斥或(XOR)運算,得到區塊 $T_i$。
  3. 產生衍生金鑰(DK):
    PBKDF2 會依序計算出 $T_1, T_2, T_3, \dots$ 等多個區塊,並將它們串接起來。最後,再從這個串接起來的結果中,截取所需要的長度,作為最終的衍生金鑰(Derived Key, DK)。

PBKDF1:一個已被淘汰的方案

相較於 PBKDF2,第一代的 PBKDF1 的設計較為簡單。它同樣會輸入密碼、一個 8 位元組的鹽,以及迭代次數。其作法是先將密碼和鹽值串接後進行雜湊運算,之後再將前一次的雜湊結果重複進行雜湊運算,直到達到指定的迭代次數。最後再從結果中取出所需長度的金鑰。由於其設計相對簡單,安全性已不如 PBKDF2,因此不再被推薦使用。first image

標準與應用

PBKDF2 的規格被詳細定義在多個標準之中,例如 PKCS#5 v2.0 (RFC2898) 和 PKCS#11。在 ASN.1 的語法中,PBKDF2 的參數包含鹽值(salt)、迭代次數(iterationCount)、金鑰長度(keyLength)以及所使用的偽隨機函數(prf)等。在 PKCS#11 的應用中,也可以看到透過結構體 CK_PKCS5_PBKD2_PARAMS 來設定這些參數,以產生金鑰。

總結來說,PBKDF2 提供了一個穩固且標準化的方法,讓我們能夠將使用者易於記憶的密碼,轉換為具備高安全性的加密金鑰,是現代密碼學應用中不可或缺的一環。

參考資料

  • RFC 2898 - PKCS #5: Password-Based Cryptography Specification Version 2.0
  • PKCS#5 v2.0 - Password-Based Cryptography Specification

也許你也會想看看