PKCS5 v2.1主要講述了三個方面的內容:
- 基於口令的密鑰導出函數PBKDF。
- PBKDF1:僅兼容PKCS5 v1.5用,使用HASH(MD2、MD5、SHA-1),導出密鑰≤ hLen。
- PBKDF2:推薦使用,使用HMAC,導出密鑰可很長。方案同NIST SP800-132的PBKDF。
- 基於口令的加密方案,用PBKDF導出密鑰進行加密。
- PBES1:僅兼容PKCS5 v1.5,PBKDF1 + DES / RC2 – CBC
- PBES2:推薦使用,PBKDF2 + AES-CBC-Pad
- 基於口令的消息認證方案,用PBKDF導出密鑰計算MAC。
主要涉及如下幾個參數
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,無需保密,增加密文多變性,可爲口令索引值或僞隨機數等。
- c:迭代次數,口令導出密鑰時的迭代次數,建議不小於1000,以適當增加使用者負擔,但可以顯著增加攻擊者難度。
- DK:導出密鑰。
- dkLen:導出密鑰的字節長度。
- hLen:雜湊函數的輸出字節長度。
口令的選擇建議參考如下文檔。
- NIST SP 800-63: Electronic Authentication Guideline: Recommendations of the National Institute of Standards and Technology, Appendix A, April 2006.
5. 基於口令的密鑰導出函數
有兩個基於口令的密鑰導出函數PBKDF方案,如下表。
表5.1 基於口令的密鑰導出函數PBKDF1和PBKDF2對比
(hLen爲HASH函數的輸出長度)
項目 |
PBKDF1 |
PBKDF2 |
HASH函數 |
MD2 MD5 SHA-1 |
HMAC (HMAC底層使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512) |
導出密鑰長度 |
≤ hLen |
≤ (232 – 1) × hLen |
使用 |
不推薦 僅兼容PKCS5 v1.5 |
推薦使用 |
對比NIST SP800-132 |
NIST SP800-132無PBKDF1函數 |
NIST SP800-132的PBKDF即PBKDF2函數 |
NIST SP800-132基於口令的密鑰導出函數,是基於PKCS5得到。
5.1 PBKDF1
說明:NIST SP800-132基於口令的密鑰導出函數不涉及此PBKDF1函數。
函數:DK = PBKDF1 (P, S, c, dkLen)
功能:基於口令的密鑰導出函數PBKDF1
輸入參數:
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
- dkLen:導出密鑰DK的字節長度,≤ hLen。
內部參數:
- HASH:雜湊函數(爲MD2、MD5、SHA-1)。
- hLen:雜湊函數的輸出字節長度。
- MSB(L, M):獲取數據串M的高L字節。
返回數據:
- DK:導出密鑰。
執行步驟:
步驟1:若dkLen > hLen,返回錯誤標識。
步驟2:T0 = P || S。
步驟3:for i = 1,2,..., c,執行
3.1 Ti = Hash (Ti-1)
步驟4:返回導出密鑰DK = MSB (dkLen, Tc)。
5.2 PBKDF2
說明:NIST SP800-132基於口令的密鑰導出函數PBKDF即此PBKDF2函數。
函數:DK = PBKDF2 (P, S, c, dkLen)
功能:基於口令的密鑰導出函數PBKDF2
輸入參數:
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
- dkLen:導出密鑰DK的字節長度,≤ (232 – 1) × hLen。
內部參數:
- PRF:僞隨機函數,可以是HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
- hLen:雜湊函數的輸出字節長度。
- MSB(L, M):獲取數據串M的高L字節。
返回數據:
- DK:導出密鑰。
執行步驟:
步驟1:若dkLen > (232 – 1) × hLen,返回錯誤標識。
步驟2:分組數l和最後一個分組的大小r是
,
,
(即r = dkLen mod hLen,但模值爲0時修正爲hLen)。
步驟3:for i = 1,2,..., l
3.1 Ti = 0,U0=S || Int(i)(Int(i)爲i值的32比特大端表示)
3.2 for j = 1,2,..., c
3.2.1 Uj= PRF (P, Uj-1)
3.2.2 Ti = Ti⊕Uj
步驟4:返回DK= MSB(T1 || T2 || ... || Tl , dkLen)。
備註:PKCS5 v2.1 PBKDF2和NIST SP800-132 PBKDF中使用的PRF都是HMAC,而NIST SP800-108(普通密鑰導出函數,非基於口令的密鑰導出函數)中使用的PRF可以是HMAC或CMAC。