PKCS #5 v2.0: Password-Based Cryptography Standard (PKCS #5: 基於口令的密碼系統規範 版本2.0)
PKCS #5: 基於口令的密碼系統規範 版本2.0
摘要
本備忘錄代表源自RSA實驗室的公鑰密碼系統標準(PKCS)系列的PKCS#5v2.0的再版,變更控制仍保留在PKCS過程。該文件的主體,除了安全性考慮一節,都是直接從那個規範中獲得的。
本文件提供基於口令的密碼系統的實現建議,覆蓋金鑰匯出函式,加密方案,訊息鑑別方案,及與該技術等同的ASN.1語法。
建議的意圖是供計算機和通訊系統的一般程式使用,因此包括了相當數量的靈活性。它們特別為敏感資訊的保護設計,例如PKCS#8[25]中的私鑰。期望有基於這些規範的應用標
準和實現輪廓可能包括附加的約束。
其它基於口令的密碼技術,例如基於口令的金鑰實體認證和金鑰建立協議[4][5][26]不在本文件範圍。口令的選取原則也不在本文件範圍。
目錄
1介紹
本文件為基於口令的金鑰系統的實現提供建議,包括了下列的方面:
- 金鑰匯出函式
- 加密方案
- 訊息鑑別方案
- 與該技術等同的ASN.1語法
本文的目標是供給計算機和通訊系統的一般程式使用,因此包括了一定的靈活性。它為保護特別敏感資訊而設計,例如PKCS#8[25]中的私鑰。基於本規範實現的應用應該包含附加的限制。
其它基於口令的密碼技術,例如基於口令的金鑰實體認證和金鑰建立協議[4][5][26]不在本文件範圍。口令的選取原則也不在本文件範圍。
本文件取代PKCS#5v1.5[24],但包含的技術是相容的。
2記法
C 密文,一個位元組串
c 迭代次數,一個正整數
DK 匯出金鑰,一個位元組串
dkLen 匯出金鑰的位元組長度,一個正整數
EM 編碼訊息,一個位元組串
Hash 基礎的雜湊函式
hLen偽隨機函式輸出的位元組長度,一個正整數
l 匯出金鑰的塊長度,一個正整數
IV 初始向量,一個位元組串
K 加密金鑰,一個位元組串
KDF 金鑰匯出函式
M 訊息,一個位元組串
P 口令,一個位元組串
PRF 基礎的偽隨機函式
PS 填充串,一個位元組串
psLen 填充串的位元組長度,一個正整數
S 噪點,一個位元組串
T 訊息鑑別碼,一個位元組串
T_1,…,T_1,U_1,…,U_c 中間數,一個位元組串
01,02,…,08 值為1,2,…,8的位元組
\xor 兩個位元組串的按位異或
||.|| 位元組長度操作符
|| 級聯操作符
<i..j> 子串抽取操作符:抽取位元組i到j,016,或對於SHA-1,dkLen>20,(即dkLen大於雜湊函式的輸出長度),輸出“derivedkeytoolong”並停止。
3綜述
在許多使用公共金鑰的應用中,使用者安全最終依賴與一個或者多個祕密文字或者口令。因為口令是不能作為金鑰作用於常規的加密體系,但一些安全操作是需要口令的傳遞的。此外因為口令通常從一個很小的空間內選擇,需要特別考慮搜尋型別的攻擊。
一個基於口令演算法的一般方法,是在Morris和Thompson[8]描述的密碼錶保護,將口令和一個噪點繫結在一起產生一個金鑰。噪點可以被認為是來自於口令的大的金鑰陣列的索引,無需保密,儘管攻擊者能也能構建一個可能密碼的金鑰組。因為對每個密碼都有很多可能的金鑰,所以構建可能的金鑰組將是困難的。攻擊者也會在區分密碼和噪點時候遇到很大的限制。
另一個基於口令演算法的方法是構建金鑰派生技術,這是相對昂貴的技術,從而增加了窮舉搜尋的代價。實現這一點的一個方法是在金鑰派生技術中增加一個迭代次數,來標明某個金鑰被迭代函式迭代的次數。適度數量的迭代,比如1000,對合法夥伴不是負擔,但是對攻擊者,將是一個巨大的負擔。
噪點和迭代次數是PKCS#5 v1.5中基於密碼演算法的基礎,並在此提供了若干的演算法操作。因此這裡定義的金鑰匯出是一個基於口令,噪點,和迭代的函式,其中後兩個單位不需要保密。
作為一個基於口令的金鑰匯出函式,很容易定義基於密碼的加密和訊息認證計劃。和PKCS#5 V1.5中一樣,基於密碼的加密方案基於一個傳統的、常規的加密方案,常規方案的金鑰是從密碼分散出的。同樣,基於密碼的訊息認證方案業是基於一個傳統的、常規的方案。這兩個層面的方法使得基於口令的技術可以模組化為它們基於的傳統方案。
據估計,基於口令的金鑰派生功能可以發展其它的不僅僅提供此處定義的加密和訊息認證方案的應用。例如,有人可以使用有一個金鑰分散功能的應用分散出一組金鑰,而不是一個金鑰。集合中的金鑰將會由金鑰派生函式的輸出的子串獲得。這種做法將可能作為一個面向會話的協議的金鑰建立的一部分。另外的應用是密碼檢查,金鑰匯出函式的輸出被儲存,為了後續的驗證和密碼服務。
在本文件中,口令被認為是一個任意長度的位元組串,並考慮到互操作性解釋為一個不定長的文字串。然而,建議應用遵循一些共同的文字編碼規則。ASCII和UTF-8是兩種可能的選擇。儘管口令的選擇不在本規範的範圍內,但有很多釋出的指導方案。
4噪點和迭代次數
因為噪點和迭代次數是這個文件中定義的技術核心,一些進一步的討論是必要的。
4.1噪點
傳統的對基於口令加密演算法中對噪點的使用是基於噪點在對給定的口令生成一大組金鑰中隨機選擇一個。通過一個金鑰匯出函式KDF來選擇一個唯一的金鑰如下:
DK = KDF (P, S)
其中DK是確定的金鑰,P是口令,S是噪點。這有兩個好處:
1.攻擊者很難預先計算對應的密碼錶的所有金鑰,或者是最有可能的金鑰。距離,如果噪點是64位元長,那麼對每個密碼將有多達264的金鑰。因此攻擊者在已知噪點和基於密碼的操作的前提下,還是很難查詢密碼。
2.相同的金鑰被選中兩次是不太可能的,同樣,如果噪點是64位元長,根據生日悖論,儘管產生了232個金鑰,金鑰之間碰撞的機會並不顯著。這解決了一些對相同金鑰的多次使用的關切,可以適用於一些加密和認證技術。
在基於口令的加密中,加密訊息的一方可以得到保證,這些好處包括在從口令派生加密金鑰的時候,簡單的直接選擇一個足夠大,足夠隨機的噪點。產生訊息認證碼的一方業能獲得類似的保證。反而解密訊息和認證訊息的一方,不能確定其它方提供的噪點是否是隨機生成。
舉個例子,在企圖利用相同金鑰的操作中,從另一個基於口令的操作中複製噪點也是可能的。例如,假定兩個合法參與方使用一個共享的口令和一些噪點分散的80位元的金鑰來交換一個加密訊息。一個攻擊者可以從加密過程獲得噪點,並且將其提供其中一方,就像它是一個40位元的金鑰。如果相關方使用40位元金鑰解密出來結果,那麼攻擊者也只能解決40位元的金鑰。而40位元金鑰是80位元金鑰的前半部分,攻擊者不能獲得80位元金鑰的後半部分。
為了抵禦這種攻擊,任何使用相同金鑰的多用途互動都應該仔細分析,或者噪點應該包含明確的資料來區分不同的操作。例如,噪點有一個附加的非隨機的位元組來表明是否派生金鑰是用於加密還是用於訊息認證,或者其它的操作。
基於如此,噪點的選擇有如下建議:
1.如果對基於口令的加密和驗證演算法互動使用相同金鑰不關注,那麼噪點的產生可以是隨機的,並且不許要接收噪點的特定一方做檢查。它應該最少8個位元組(64位元)長。
2.否則,噪點除了最少為8個位元組的隨機部分,還應該包含特定的資料明確區分不同的操作和不同的金鑰長度,這部分的資料應該被噪點的接受方檢查或重新生成。例如,噪點可能有一個額外的非隨機位元組定義了派生金鑰的目的。另外,它可能是一個結構體編碼定義了發行金鑰的細節資訊,例如加密或者認證演算法和一個從口令派生出來的序列號。特定的結構取決於應用。
4.2迭代次數
一個迭代次數通常用來增加從口令產生金鑰的代價,從而也增加了攻擊的難度。對於這個文件中的方法,建議至少1000次迭代,這將顯著的增加窮舉查詢的代價,而給特定金鑰派生帶來的代價則不明顯。
5金鑰派生功能
一個金鑰匯出函式從一個基礎金鑰和其它的引數產生一個派生金鑰。在一個基於口令的金鑰匯出函式中,基礎金鑰是口令和第三章所述的其它引數:噪點和迭代次數。
此處定義的基於口令的金鑰分散函式主要應用是定義在第六章的加密方案和定義在第七章的訊息認證方案。基於這些獨立的功能定義,其它應用當然也是可能的。
這章定義了兩個方法: PBKDF1和PKDF2。建議新的應用使用PKDF2;PKDF1提供僅僅是為了和已經存在應用的相容性,並不建議在新的應用中使用。
此處定義的一個典型金鑰匯出函式可能包含如下步驟:
1.選擇一個噪點S和一個迭代次數c,如第四章所述。
2.選擇一個派生金鑰的長度,dkLen。
3.對口令,噪點,迭代次數和金鑰長度使用金鑰匯出函式生成一個匯出金鑰。
4.輸出匯出金鑰
如第三章所述,通過不同的噪點,一個口令可以匯出任意數目的金鑰。
5.1 PBKDF1
PBKDF1使用一個雜湊函式,可以是MD2,MD5,MD5或者SHA-1的一個來派生金鑰。派生金鑰的長度是和雜湊函式的輸出繫結在一起的,MD2和MD5是16個位元組,而SHA-1是20個位元組。PBKDF1相容PKCS #5 V1.5。
PBKDF1只為相容現有的應用,因為對一些應用來說它產生的金鑰不夠大。
PBKDF1(P,S,c,dkLen)
選項: 輸入的雜湊函式
輸入: P 口令,一個位元組串
S 噪點,長度為8的位元組串
c 迭代次數,一個正證書
dkLen 派生金鑰的位元組長度,一個正證書。MD2/MD5的時候最大為16,SHA-1的時候最大為20
輸出: DK 派生金鑰,長度為dkLen的位元組串
步驟: 1.如果在MD2和MD5的時候,dkLen>16,或者在SHA-1的時候dkLen>20,輸出“派生金鑰太長”並停止。
2.對P和S組成的串,做c次迭代。
T1 = Hash(P||S),
T2 = Hash(T1),
...
Tc = Hash(Tc-1),
DK = TC(0...dkLen-1)
3.輸出匯出金鑰DK。
5.2 5.2 PBKDF2
PBKDF2使用一個偽隨機函式來派生金鑰。派生金鑰的長度基本上是不受限制的。(然而,派生金鑰的最大有效查詢空間可能收到偽隨機函式的限制,參見附錄B.1的討論)PBKDF2建議在新的應用上實施。
選項: PRF 輸入的偽隨機數函式(hLen標識了偽隨機函式輸出的位元組的長度)
輸入: P 口令,一個位元組串
S 噪點,一個位元組串
c 迭代次數,一個正整數
dkLen 派生金鑰的位元組長度,一個正整數,最多(2^32-1)*hLen
輸出: DK 派生金鑰,長度為dkLen的位元組串
步驟: 1.如果dkLen > (2^32-1)*hLen,輸出“派生金鑰過長”,並停止
2.設l為派生金鑰key位元組中hLen塊的個數,並令r作為最後一塊的位元組數。
l = [dkLen/hLen];
r = dkLen-(l-1)*hLen.
3.對於每個塊,使用以下定義的函式F分別計算派生金鑰。
T1 = F(P,S,c,1),
T2 = F(P,S,c,2),
其中函式F被定義為前c個使用口令P,噪點S,和塊下標的PRF函式的迭代:
F(P,S,c,i) = U1 xor U2 xor ... xor Uc
其中
U1 = PRF(P,S||INT(i)),
U2 = PRF(P,U1),
...
Uc = PRF(P,Uc-1).
其中INT(i)是一個採用大端的四位元組整數編碼。
4.級聯各個塊,並提取前dkLen的有效塊來產生一個派生金鑰DK:
DK = T1 || T2 ||...||Tl<0...r-1>
5.輸出派生金鑰DK.
注意事項。函式F的構建遵循“萬無一失”的方針。通過遞迴計算來獲得迭代的Ui是為了降低攻擊者的並行程度;同時使用異或操作是為了降低小集合的值的遞迴退化問題。
6加密方案
在對稱的設定下,加密演算法由一個加密操作和一個解密操作構成,其中加密操作在金鑰的參與下把訊息生成密文,解密操作使用相同的金鑰將訊息從米文中恢復出來。在基於口令的加密方案中,金鑰就是口令。一個基於口令的加密方案的典型應用就是私鑰保護方案,訊息中包含了定義在PKCS#8中的私鑰資訊。此處定義的加密方案將滿足那種情況下的加密演算法需求。在本節中有兩個方案定義:PBES1和PBES2.PBES2建議在新應用中使用,PBES1為了相容已經存在的應用,在新的應用中不建議使用。
6.1PBES1
PBES1與基於塊的演算法PKDF1繫結,包含CBC模式的DES或者RC2TM。PBES1相容PKCS#5 v1.5.
PBES1只為相容已有應用,因為它只支援兩種金鑰長度(56或64位元),不足以滿足某些應用的長度需要。
6.1.1加密操作
PBES1的加密操作包含如下幾個步驟,使用口令P對訊息M產生密文C。
1.如第四節目所述,選擇一個8位元組噪點和迭代次數c。
2.對口令P,噪點S,和迭代次數使用PBKDF1金鑰匯出函式,生成一個長度為16個位元組的匯出金鑰。
DK = PBKDF1(P,S,c,16).
3.將匯出金鑰分割為前8位元組為金鑰K,後8位元組為初始向量IV:
K = DK<0...7>
IV= DK<8...15>
4.級聯訊息M和填充串PS為編碼訊息EM:
EM = M || PS
其中填充串PS由8-(||M|| mod 8)長度的值為8-(||M|| mod 8)的位元組組成。填充串PS將滿足如下的規律:
PS = 01 -- 如果||M|| mod 8 = 7
PS = 02 02 -- 如果||M|| mod 8 = 6
...
PS = 08 08 08 08 08 08 08 08 --如果||M|| mod 8 = 0
編碼後的訊息長度將是8的倍數,並可以從編碼的訊息中明確的恢復訊息M
(這個填充規則來自 RFC 1423 [3].)
5.使用基於塊的加密演算法(DES或者RC2)用金鑰K和初始向量IV加密編碼訊息EM來產生DES密文C。對於DES,56位元K應該被編碼為64位元,忽略校驗位。對RC2,有效位為64位元。
6.輸出密文C
噪點S和迭代次數c可能通過附錄A.3提到的AlgorithmIdentifier值傳達給解密的一方。
6.1.2解密操作
PBES1的解密操作包括以下步驟,將密文C使用口令P恢復為訊息M:
1.獲得八個位元組的噪點S和迭代次數c
2.對口令P,噪點S和迭代次數c使用PBKDF1金鑰匯出函式產生長度為16個位元組的匯出金鑰。
DK = PBKDF1(P,S,c,16)
3.將匯出金鑰DK分散為前8個位元組的金鑰K,和後8個位元組的初始向量IV
K = DK<0...7>
IV= DK<8...15>
4.使用基於塊的演算法(DES或者RC2)使用K和初始向量IV解密密文C。如果密文C的位元組長度不是8的倍數,輸出“解密失敗”並停止。
5.將編碼訊息EM分割為訊息M和填充串PS
EM = M || PS
其中,填充串PS由psLen個數值為psLen的位元組組成,其中psLen在1和8之間。如果不能分割,輸出“解密失敗”並停止。
6.輸出恢復的訊息M。
6.2PBES2
PBES2包含了一個在這個版本的PKCS#5中定義的基於口令的金鑰匯出函式PBKDF2,和一個給定的加密方案(參加附錄B2),金鑰的長度和其它的引數依賴於加密方案。
PBES2建議在新的應用上使用。
6.2.1加密操作
PBES2的加密操作包括以下幾個步驟,用以使用口令P對訊息M通過金鑰分散KDF和選擇特定的加密方案產生一個密文C:
1.選擇一個噪點S和一個迭代次數c。參照第四章。
2.根據加密方案選擇匯出金鑰的位元組長度dkLen。
3.對口令P,噪點S和迭代次數使用金鑰匯出函式產生一個長度為dkLen的位元組串。
DK = KDF(P,S,c,dkLen)
4.使用既定的加密方案用匯出金鑰DK和訊息M,產生密文C(這個步驟可能設計引數的選擇如初始化向量和填充)
5.輸出密文C
噪點S,迭代次數c和金鑰長度dkLen和金鑰匯出函式以及使用的演算法通過AlgorithmIdentifier值的方式傳遞到解密方。
6.2.2解密操作
PBES2的解密操作通過如下幾個步驟,在口令P的參與下將密文C恢復為訊息M:
1.獲得操作用的噪點S。
2.獲得金鑰匯出的迭代次數c。
3.根據給定的演算法,獲得金鑰的位元組長度dkLen。
4.使用口令P,噪點S,和迭代次數c以及dkLen產生長度為dkLen的匯出金鑰:
DK = KDF(P,S,c,dkLen)
5.用給定的加密演算法使用金鑰DK來恢復訊息M,如果解密演算法輸出“解密錯誤”,輸出“解密錯誤”並停止。
6.輸出恢復的訊息M。
7訊息認證方案
一個訊息認證方案由一個MAC(訊息認證碼)生成操作和一個MAC驗證操作組成,其中的MAC生成操作在一個金鑰的作用下從一個訊息生成一個訊息認證碼,並且MAC驗證操作使用相同的金鑰來認證訊息認證碼。在一個基於口令的訊息認證方案中,金鑰就是口令。
7.1PBMAC1
PBMAC1由一個本版本PKCS#5定義的基於口令的金鑰匯出函式PBKDF2和給定的訊息認證方案(參見附錄B3)組成。金鑰長度和其他的引數依賴於訊息認證方案。
7.1.1MAC生成
PBMAC1使用的MAC生成演算法通過以下的步驟,用口令P和訊息M通過選定的金鑰匯出函式KDF和選定的訊息認證方案生成一個訊息認證碼T。
1.選擇一個噪點S和一個迭代次數c。(參見第四章)
2.根據給定的訊息認證函式,選擇金鑰的長度dkLen。
3.對口令P,噪點S,和迭代次數c使用選定的金鑰匯出函式,生成長度為dkLen的匯出金鑰。
DK = KDF(P,S,c,dkLen).
4.用給定的訊息驗證方案在匯出金鑰DK的作用下,將訊息M生成一個訊息驗證碼T。
5.輸出訊息認證碼T。
噪點S,迭代次數c,金鑰長度dkLen,和金鑰匯出函式以及訊息認證方案的標識通過AlgorithmIdentifier值傳遞給訊息驗證方。
7.1.2MAC驗證
PBMAC1的MAC驗證操作包括以下的步驟,通過訊息M和口令P來驗證訊息驗證碼T:
1.獲得噪點S和迭代次數c。
2.根據特定的訊息認證方案獲得金鑰的位元組長度dkLen。
3.對口令P,噪點S,和迭代次數c使用選定的金鑰匯出函式,生成長度為dkLen的匯出金鑰。
DK = KDF(P,S,c,dkLen).
4.用給定的訊息認證方案在匯出金鑰DK的作用下,驗證訊息M的驗證碼T。
5.如果訊息驗證碼得到驗證,輸出“正確”,否則輸出“錯誤”
附錄AASN.1語法
本章為金鑰匯出函式,加密方案,訊息認證方案定義了ASN.1語法。使用此處定義的應用包括PKCS#8和其它一些金鑰管理,加密資料,資料完整性保護。
物件識別符號pkcs-5標識OID的例項,本節中PKCS#5所有的OID從中派生出。
rsadsi OBJECT IDENTIFIER ::={iso(1) member-body(2) us(840) 113549}
pkcs OBJECT IDENTIFIER ::= {rsadsi 1}
pkcs-5 OBJECT IDENTIFIER ::= {pkcs 5}
A.1PBKDF1
PBKDF1沒有給出物件識別符號,因為PBES1的物件識別符號號對已有應用已經足夠,對新的應用推薦使用PBKDF2。
A.2PBKDF2
物件識別符號id-PBKDF2標識PBKDF2金鑰匯出函式(5.2節)。
id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12}
AlgorithmIdentifier中與這個OID關聯的引數的型別為PBKDF2-params:
PBKDF2-params ::= SEQUENCE {
salt CHOICE {
specified OCTET STRING,
otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}
},
iterationCount INTEGER (1..MAX),
keyLength INTEGER (1..MAX) OPTIONAL,
prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1
}
型別PKDF2-params的屬性有如下的意義:
salt定義了噪點值,或者是噪點值的來源。它應該是一個特定的位元組串或者一個為後續版本保留的型別為PBKDF2-SaltSources的OID。
salt-source方法被設計用於如何產生噪點,以一個演算法ID的引數或者應用資料,或兩者都有。例如,它可能像4.1章建議的那樣,表明了噪點是如何從匯出金鑰的特定資訊部分匯出的。在其它的一些地方可以攜帶一些資訊,例如加密演算法ID。然而這種功能會在PKCS#5的後續版本中提供。在這個版本,一應用可能通過在指定的選擇中指定噪點的描述,達到節4.1提到的好處。
PBKDF2-SaltSources ALGORITHM-IDENTIFIER ::= { ... }
iterationCount定義了迭代次數。最大允許的迭代次數依賴於實現。具體的實現可以做進一步的限制。
keyLength 一個可選的屬性,表示派生金鑰的位元組長度。最大允許的長度依賴於實現,具體的實現可以做進一步的限制。這個屬性的提供僅僅是為了方便。金鑰的長度沒有加密保護,如果要考慮對一個給定的噪點使用不同長度金鑰的互動,噪點應該區分不同的金鑰長度。
prf 標識了給定的偽隨機數生成函式。它應該是屬於PBKDF2-PRFs的一個OID。此版本的PKCS#5定義了包含了algid-hmacWithSHA1(附錄B1.1),其他的方法由應用定義。
PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= { {NULL IDENTIFIED BY id-hmacWithSHA1}, ... }
預設的偽隨機數生成函式是HMAC-SHA1:
algid-hmacWithSHA1 AlgorithmIdentifier {{PBKDF2-PRFs}} ::= {algorithm id-hmacWithSHA1, parameters NULL : NULL}
A.3PBES1
通過指定在金鑰分散中指定雜湊演算法和指定塊演算法的的物件識別符號,標識了PBES1加密方案,如下:
雜湊函式 塊演算法 OID
MD2 DES pkcs-5.1
MD2 RC2 pkcs-5.4
MD5 DES pkcs-5.3
MD5 RC2 pkcs-5.6
SHA-1 DES pkcs-5.10
SHA-1 RC2 pkcs-5.11
pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1}
pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4}
pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3}
pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6}
pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10}
pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11}
對每個OID, 和OID關聯的parameters屬性對應的AlgorithmIdentifier應該屬於PBEParameter型別。
PBEParameter ::= SEQUENCE {
salt OCTET STRING (SIZE(8)),
iterationCount INTEGER
}
型別PBEParameter的屬性有如下的意義:
salt 指定的噪點值,8個位元組的位元組串。
iterationCount 定義了迭代次數。
A.4PBES2
物件識別符號id-PBES2標識了PBES2加密方案。
id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}
在AlgorithmIdentifier中與OID關聯的parameter屬性採用PBES2-params型別:
PBES2-params ::= SEQUENCE {
keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},
encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}
}
PBES2型別的屬性有如下的意義:
keyDerivationFunc表明了使用的金鑰派生函式。它將是集合PKES2-KDFs中的一個OID,對這個版本的PKCS#5應該等於id-PKDF2
PBES2-KDFs ALGORITHM-IDENTIFIER ::= { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }
encryptionScheme表明了使用的加密方案,它將是集合PKES2-Encs中的一個OID,由應用定義,附錄B.2給出了參考演算法。
PBES2wei-Encs ALGORITHM-IDENTIFIER ::= { ... }
A.5PBMAC1
物件識別符號id-PBMAC1標識了PBMAC1訊息認證方案。
id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14}
在AlgorithmIdentifier中與OID關聯的parameters屬性遵從PBMAC1-params型別:
PBMAC1-params ::= SEQUENCE {
keyDerivationFunc AlgorithmIdentifier {{PBMAC1-KDFs}},
messageAuthScheme AlgorithmIdentifier {{PBMAC1-MACs}}
}
keyDerivationFunc屬性和PBES2-params對應的屬性有相同的意義,除了OID是PBMAC1-KDFS。
messageAuthSheme屬性標識了給定的訊息認證方案。它應該是集合PBMAC1-MACs集合中的一個OID,由應用定義,附錄B.3給出了參考演算法。
PBMAC1-MACs ALGORITHM-IDENTIFIER ::= { ... }
B.支援的技術
這章給出了在5,6,7章提到的支援基於口令方案特定的函式和方案的若干參考實現。這些參考的實現還取決於應用,沒有任何是一定要求實現的。當然希望採用PKCS#5開發的應用可以使用支援的技術。
這章也給出了支援技術的物件識別符號。
物件識別符號 digestAlgorithm和encryptionAlgorithm表明了這章演算法OID繼承的根。
digestAlgorithm OBJECT IDENTIFIER ::= {rsadsi 2}
encryptionAlgorithm OBJECT IDENTIFIER ::= {rsadsi 3}
B.1偽隨機數生成函式
PBKDF2使用的偽隨機函式的一個例子是HMAC-SHA-1。
B.1.1 HMAC-SHA-1
HMAC-SHA-1是參照基於SHA-1雜湊演算法的HMAC訊息認證碼的偽隨機函式。偽隨機函式和計算訊息認證碼使用的是相同的方法,使用輸出的全部長度。HMAC-SHA1-1有一個變長的金鑰和一個長度為20位元組的輸出。
儘管HMAC-SHA1-1的金鑰長度基本上不受限制,但有效的偽隨機數查詢空間可能會收到函式結構的限制。特別是,當金鑰長度超過512位元的時候,HMAC-SHA-1將首先將其雜湊為160位元。即使一個長的派生金鑰由口令經過若干偽隨機數函式的輸出組成,有效的偽隨機數查詢空間還知識160位元。儘管其它金鑰長度的限制依賴於HMAC的構建,但應該保證,穩定,有效的搜尋空間限制,金鑰的長度限制在160位元為佳。
(160位元的限制通常情況下在基於口令的加密下不會是一個實際的限制。因為口令的搜尋空間一般不超過160個位元。)
物件識別符號id-hmacWithSHA1標識了HMAC-SHA-1偽隨機數函式:
id-hmacWithSHA1 OBJECT IDENTIFIER ::= {digestAlgorithm 7}
在AlgorithmIdentifier中與OID關聯的parameters屬性的型別是NULL。物件識別符號在集合PBKDF2-PRFs集合中選擇。
B.2加密方案
PBES2使用的例子加密方案是 DES-CBC-Pad, DES-EDE2-CBC-Pad, RC2-CBC-Pad, 和RC5-CBC-Pad.
這章給出的物件識別符號在物件集合PBES2-Encs中選擇。
B.2.1DES-CBC-Pad
DES-CBC-Pad是一個使用CBC模式和RFC1423填充操作(第6.1.1章)的單DES。DES-CBC-Pad有一個8位元組的加密金鑰和一個8位元組的初始向量。金鑰被認為是對DES 56位元金鑰的64位元編碼,校驗位元被忽略。
物件識別符號deCBC定義了DES-CBC-Pad加密方法:
desCBC OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7}
在AlgorithmIdentifier中的與OID對應的paramters屬性是一個OCTET STRING (SIZE(8))型別,定義了CBC模式的初始向量。
B.2.2DES-EDE3-CBC-Pad
DES-EDE3-CBC是一個使用CBC模式和RFC1423填充操作的三金鑰3DES。DES-EDE3-CBC-Pad有一個24位元組加密金鑰和一個8位元組的初始向量。金鑰被認為3組8位元組的金鑰,每個金鑰為56位元金鑰的64位元編碼,校驗位元被忽略。
AlgorithmIdentifier結構中與OID關聯的parameters屬性的型別是 OCTET STRING (SIZE(8)),定義了CBC模式的初始向量。
注意。非填充的DES-EDE3-CBC的OID在ANSI X9.52中給出;建議使用此處定義的,因為它明確了填充。
B.2.3RC2-CBC-Pad
...
B.2.4RC5-CBC-Pad
...
B.3訊息認證方案
此處給出的PBMAC1的訊息認證方案是HMAC-SHA-1.
B.3.1HMAC-SHA-1
HMAC-SHA-1是基於SHA-1雜湊函式的HMAC訊息認證方案。HMAC-SHA-1有一個可變的金鑰長度和一個20位元組的訊息認證碼。
物件識別符號id-hmacWithSHA-1標明瞭HMAC-SHA-1訊息認證方案。(偽隨機數和訊息認證方案使用相同的OID,結合上下文區分)這個物件識別符號在集合PBMAC1-Macs中獲得。
C.ASN.1模組
...
D.智慧財產權
...
E.版本歷史
Versions 1.0–1.3
Version 1.4
Version 1.5
Version 2.0
F.參考知識
...
G.關於PKCS
...
摘要
本備忘錄代表源自RSA實驗室的公鑰密碼系統標準(PKCS)系列的PKCS#5v2.0的再版,變更控制仍保留在PKCS過程。該文件的主體,除了安全性考慮一節,都是直接從那個規範中獲得的。
本文件提供基於口令的密碼系統的實現建議,覆蓋金鑰匯出函式,加密方案,訊息鑑別方案,及與該技術等同的ASN.1語法。
建議的意圖是供計算機和通訊系統的一般程式使用,因此包括了相當數量的靈活性。它們特別為敏感資訊的保護設計,例如PKCS#8[25]中的私鑰。期望有基於這些規範的應用標
準和實現輪廓可能包括附加的約束。
其它基於口令的密碼技術,例如基於口令的金鑰實體認證和金鑰建立協議[4][5][26]不在本文件範圍。口令的選取原則也不在本文件範圍。
目錄
1介紹
本文件為基於口令的金鑰系統的實現提供建議,包括了下列的方面:
- 金鑰匯出函式
- 加密方案
- 訊息鑑別方案
- 與該技術等同的ASN.1語法
本文的目標是供給計算機和通訊系統的一般程式使用,因此包括了一定的靈活性。它為保護特別敏感資訊而設計,例如PKCS#8[25]中的私鑰。基於本規範實現的應用應該包含附加的限制。
其它基於口令的密碼技術,例如基於口令的金鑰實體認證和金鑰建立協議[4][5][26]不在本文件範圍。口令的選取原則也不在本文件範圍。
本文件取代PKCS#5v1.5[24],但包含的技術是相容的。
2記法
C 密文,一個位元組串
c 迭代次數,一個正整數
DK 匯出金鑰,一個位元組串
dkLen 匯出金鑰的位元組長度,一個正整數
EM 編碼訊息,一個位元組串
Hash 基礎的雜湊函式
hLen偽隨機函式輸出的位元組長度,一個正整數
l 匯出金鑰的塊長度,一個正整數
IV 初始向量,一個位元組串
K 加密金鑰,一個位元組串
KDF 金鑰匯出函式
M 訊息,一個位元組串
P 口令,一個位元組串
PRF 基礎的偽隨機函式
PS 填充串,一個位元組串
psLen 填充串的位元組長度,一個正整數
S 噪點,一個位元組串
T 訊息鑑別碼,一個位元組串
T_1,…,T_1,U_1,…,U_c 中間數,一個位元組串
01,02,…,08 值為1,2,…,8的位元組
\xor 兩個位元組串的按位異或
||.|| 位元組長度操作符
|| 級聯操作符
<i..j> 子串抽取操作符:抽取位元組i到j,016,或對於SHA-1,dkLen>20,(即dkLen大於雜湊函式的輸出長度),輸出“derivedkeytoolong”並停止。
3綜述
在許多使用公共金鑰的應用中,使用者安全最終依賴與一個或者多個祕密文字或者口令。因為口令是不能作為金鑰作用於常規的加密體系,但一些安全操作是需要口令的傳遞的。此外因為口令通常從一個很小的空間內選擇,需要特別考慮搜尋型別的攻擊。
一個基於口令演算法的一般方法,是在Morris和Thompson[8]描述的密碼錶保護,將口令和一個噪點繫結在一起產生一個金鑰。噪點可以被認為是來自於口令的大的金鑰陣列的索引,無需保密,儘管攻擊者能也能構建一個可能密碼的金鑰組。因為對每個密碼都有很多可能的金鑰,所以構建可能的金鑰組將是困難的。攻擊者也會在區分密碼和噪點時候遇到很大的限制。
另一個基於口令演算法的方法是構建金鑰派生技術,這是相對昂貴的技術,從而增加了窮舉搜尋的代價。實現這一點的一個方法是在金鑰派生技術中增加一個迭代次數,來標明某個金鑰被迭代函式迭代的次數。適度數量的迭代,比如1000,對合法夥伴不是負擔,但是對攻擊者,將是一個巨大的負擔。
噪點和迭代次數是PKCS#5 v1.5中基於密碼演算法的基礎,並在此提供了若干的演算法操作。因此這裡定義的金鑰匯出是一個基於口令,噪點,和迭代的函式,其中後兩個單位不需要保密。
作為一個基於口令的金鑰匯出函式,很容易定義基於密碼的加密和訊息認證計劃。和PKCS#5 V1.5中一樣,基於密碼的加密方案基於一個傳統的、常規的加密方案,常規方案的金鑰是從密碼分散出的。同樣,基於密碼的訊息認證方案業是基於一個傳統的、常規的方案。這兩個層面的方法使得基於口令的技術可以模組化為它們基於的傳統方案。
據估計,基於口令的金鑰派生功能可以發展其它的不僅僅提供此處定義的加密和訊息認證方案的應用。例如,有人可以使用有一個金鑰分散功能的應用分散出一組金鑰,而不是一個金鑰。集合中的金鑰將會由金鑰派生函式的輸出的子串獲得。這種做法將可能作為一個面向會話的協議的金鑰建立的一部分。另外的應用是密碼檢查,金鑰匯出函式的輸出被儲存,為了後續的驗證和密碼服務。
在本文件中,口令被認為是一個任意長度的位元組串,並考慮到互操作性解釋為一個不定長的文字串。然而,建議應用遵循一些共同的文字編碼規則。ASCII和UTF-8是兩種可能的選擇。儘管口令的選擇不在本規範的範圍內,但有很多釋出的指導方案。
4噪點和迭代次數
因為噪點和迭代次數是這個文件中定義的技術核心,一些進一步的討論是必要的。
4.1噪點
傳統的對基於口令加密演算法中對噪點的使用是基於噪點在對給定的口令生成一大組金鑰中隨機選擇一個。通過一個金鑰匯出函式KDF來選擇一個唯一的金鑰如下:
DK = KDF (P, S)
其中DK是確定的金鑰,P是口令,S是噪點。這有兩個好處:
1.攻擊者很難預先計算對應的密碼錶的所有金鑰,或者是最有可能的金鑰。距離,如果噪點是64位元長,那麼對每個密碼將有多達264的金鑰。因此攻擊者在已知噪點和基於密碼的操作的前提下,還是很難查詢密碼。
2.相同的金鑰被選中兩次是不太可能的,同樣,如果噪點是64位元長,根據生日悖論,儘管產生了232個金鑰,金鑰之間碰撞的機會並不顯著。這解決了一些對相同金鑰的多次使用的關切,可以適用於一些加密和認證技術。
在基於口令的加密中,加密訊息的一方可以得到保證,這些好處包括在從口令派生加密金鑰的時候,簡單的直接選擇一個足夠大,足夠隨機的噪點。產生訊息認證碼的一方業能獲得類似的保證。反而解密訊息和認證訊息的一方,不能確定其它方提供的噪點是否是隨機生成。
舉個例子,在企圖利用相同金鑰的操作中,從另一個基於口令的操作中複製噪點也是可能的。例如,假定兩個合法參與方使用一個共享的口令和一些噪點分散的80位元的金鑰來交換一個加密訊息。一個攻擊者可以從加密過程獲得噪點,並且將其提供其中一方,就像它是一個40位元的金鑰。如果相關方使用40位元金鑰解密出來結果,那麼攻擊者也只能解決40位元的金鑰。而40位元金鑰是80位元金鑰的前半部分,攻擊者不能獲得80位元金鑰的後半部分。
為了抵禦這種攻擊,任何使用相同金鑰的多用途互動都應該仔細分析,或者噪點應該包含明確的資料來區分不同的操作。例如,噪點有一個附加的非隨機的位元組來表明是否派生金鑰是用於加密還是用於訊息認證,或者其它的操作。
基於如此,噪點的選擇有如下建議:
1.如果對基於口令的加密和驗證演算法互動使用相同金鑰不關注,那麼噪點的產生可以是隨機的,並且不許要接收噪點的特定一方做檢查。它應該最少8個位元組(64位元)長。
2.否則,噪點除了最少為8個位元組的隨機部分,還應該包含特定的資料明確區分不同的操作和不同的金鑰長度,這部分的資料應該被噪點的接受方檢查或重新生成。例如,噪點可能有一個額外的非隨機位元組定義了派生金鑰的目的。另外,它可能是一個結構體編碼定義了發行金鑰的細節資訊,例如加密或者認證演算法和一個從口令派生出來的序列號。特定的結構取決於應用。
4.2迭代次數
一個迭代次數通常用來增加從口令產生金鑰的代價,從而也增加了攻擊的難度。對於這個文件中的方法,建議至少1000次迭代,這將顯著的增加窮舉查詢的代價,而給特定金鑰派生帶來的代價則不明顯。
5金鑰派生功能
一個金鑰匯出函式從一個基礎金鑰和其它的引數產生一個派生金鑰。在一個基於口令的金鑰匯出函式中,基礎金鑰是口令和第三章所述的其它引數:噪點和迭代次數。
此處定義的基於口令的金鑰分散函式主要應用是定義在第六章的加密方案和定義在第七章的訊息認證方案。基於這些獨立的功能定義,其它應用當然也是可能的。
這章定義了兩個方法: PBKDF1和PKDF2。建議新的應用使用PKDF2;PKDF1提供僅僅是為了和已經存在應用的相容性,並不建議在新的應用中使用。
此處定義的一個典型金鑰匯出函式可能包含如下步驟:
1.選擇一個噪點S和一個迭代次數c,如第四章所述。
2.選擇一個派生金鑰的長度,dkLen。
3.對口令,噪點,迭代次數和金鑰長度使用金鑰匯出函式生成一個匯出金鑰。
4.輸出匯出金鑰
如第三章所述,通過不同的噪點,一個口令可以匯出任意數目的金鑰。
5.1 PBKDF1
PBKDF1使用一個雜湊函式,可以是MD2,MD5,MD5或者SHA-1的一個來派生金鑰。派生金鑰的長度是和雜湊函式的輸出繫結在一起的,MD2和MD5是16個位元組,而SHA-1是20個位元組。PBKDF1相容PKCS #5 V1.5。
PBKDF1只為相容現有的應用,因為對一些應用來說它產生的金鑰不夠大。
PBKDF1(P,S,c,dkLen)
選項: 輸入的雜湊函式
輸入: P 口令,一個位元組串
S 噪點,長度為8的位元組串
c 迭代次數,一個正證書
dkLen 派生金鑰的位元組長度,一個正證書。MD2/MD5的時候最大為16,SHA-1的時候最大為20
輸出: DK 派生金鑰,長度為dkLen的位元組串
步驟: 1.如果在MD2和MD5的時候,dkLen>16,或者在SHA-1的時候dkLen>20,輸出“派生金鑰太長”並停止。
2.對P和S組成的串,做c次迭代。
T1 = Hash(P||S),
T2 = Hash(T1),
...
Tc = Hash(Tc-1),
DK = TC(0...dkLen-1)
3.輸出匯出金鑰DK。
5.2 5.2 PBKDF2
PBKDF2使用一個偽隨機函式來派生金鑰。派生金鑰的長度基本上是不受限制的。(然而,派生金鑰的最大有效查詢空間可能收到偽隨機函式的限制,參見附錄B.1的討論)PBKDF2建議在新的應用上實施。
選項: PRF 輸入的偽隨機數函式(hLen標識了偽隨機函式輸出的位元組的長度)
輸入: P 口令,一個位元組串
S 噪點,一個位元組串
c 迭代次數,一個正整數
dkLen 派生金鑰的位元組長度,一個正整數,最多(2^32-1)*hLen
輸出: DK 派生金鑰,長度為dkLen的位元組串
步驟: 1.如果dkLen > (2^32-1)*hLen,輸出“派生金鑰過長”,並停止
2.設l為派生金鑰key位元組中hLen塊的個數,並令r作為最後一塊的位元組數。
l = [dkLen/hLen];
r = dkLen-(l-1)*hLen.
3.對於每個塊,使用以下定義的函式F分別計算派生金鑰。
T1 = F(P,S,c,1),
T2 = F(P,S,c,2),
其中函式F被定義為前c個使用口令P,噪點S,和塊下標的PRF函式的迭代:
F(P,S,c,i) = U1 xor U2 xor ... xor Uc
其中
U1 = PRF(P,S||INT(i)),
U2 = PRF(P,U1),
...
Uc = PRF(P,Uc-1).
其中INT(i)是一個採用大端的四位元組整數編碼。
4.級聯各個塊,並提取前dkLen的有效塊來產生一個派生金鑰DK:
DK = T1 || T2 ||...||Tl<0...r-1>
5.輸出派生金鑰DK.
注意事項。函式F的構建遵循“萬無一失”的方針。通過遞迴計算來獲得迭代的Ui是為了降低攻擊者的並行程度;同時使用異或操作是為了降低小集合的值的遞迴退化問題。
6加密方案
在對稱的設定下,加密演算法由一個加密操作和一個解密操作構成,其中加密操作在金鑰的參與下把訊息生成密文,解密操作使用相同的金鑰將訊息從米文中恢復出來。在基於口令的加密方案中,金鑰就是口令。一個基於口令的加密方案的典型應用就是私鑰保護方案,訊息中包含了定義在PKCS#8中的私鑰資訊。此處定義的加密方案將滿足那種情況下的加密演算法需求。在本節中有兩個方案定義:PBES1和PBES2.PBES2建議在新應用中使用,PBES1為了相容已經存在的應用,在新的應用中不建議使用。
6.1PBES1
PBES1與基於塊的演算法PKDF1繫結,包含CBC模式的DES或者RC2TM。PBES1相容PKCS#5 v1.5.
PBES1只為相容已有應用,因為它只支援兩種金鑰長度(56或64位元),不足以滿足某些應用的長度需要。
6.1.1加密操作
PBES1的加密操作包含如下幾個步驟,使用口令P對訊息M產生密文C。
1.如第四節目所述,選擇一個8位元組噪點和迭代次數c。
2.對口令P,噪點S,和迭代次數使用PBKDF1金鑰匯出函式,生成一個長度為16個位元組的匯出金鑰。
DK = PBKDF1(P,S,c,16).
3.將匯出金鑰分割為前8位元組為金鑰K,後8位元組為初始向量IV:
K = DK<0...7>
IV= DK<8...15>
4.級聯訊息M和填充串PS為編碼訊息EM:
EM = M || PS
其中填充串PS由8-(||M|| mod 8)長度的值為8-(||M|| mod 8)的位元組組成。填充串PS將滿足如下的規律:
PS = 01 -- 如果||M|| mod 8 = 7
PS = 02 02 -- 如果||M|| mod 8 = 6
...
PS = 08 08 08 08 08 08 08 08 --如果||M|| mod 8 = 0
編碼後的訊息長度將是8的倍數,並可以從編碼的訊息中明確的恢復訊息M
(這個填充規則來自 RFC 1423 [3].)
5.使用基於塊的加密演算法(DES或者RC2)用金鑰K和初始向量IV加密編碼訊息EM來產生DES密文C。對於DES,56位元K應該被編碼為64位元,忽略校驗位。對RC2,有效位為64位元。
6.輸出密文C
噪點S和迭代次數c可能通過附錄A.3提到的AlgorithmIdentifier值傳達給解密的一方。
6.1.2解密操作
PBES1的解密操作包括以下步驟,將密文C使用口令P恢復為訊息M:
1.獲得八個位元組的噪點S和迭代次數c
2.對口令P,噪點S和迭代次數c使用PBKDF1金鑰匯出函式產生長度為16個位元組的匯出金鑰。
DK = PBKDF1(P,S,c,16)
3.將匯出金鑰DK分散為前8個位元組的金鑰K,和後8個位元組的初始向量IV
K = DK<0...7>
IV= DK<8...15>
4.使用基於塊的演算法(DES或者RC2)使用K和初始向量IV解密密文C。如果密文C的位元組長度不是8的倍數,輸出“解密失敗”並停止。
5.將編碼訊息EM分割為訊息M和填充串PS
EM = M || PS
其中,填充串PS由psLen個數值為psLen的位元組組成,其中psLen在1和8之間。如果不能分割,輸出“解密失敗”並停止。
6.輸出恢復的訊息M。
6.2PBES2
PBES2包含了一個在這個版本的PKCS#5中定義的基於口令的金鑰匯出函式PBKDF2,和一個給定的加密方案(參加附錄B2),金鑰的長度和其它的引數依賴於加密方案。
PBES2建議在新的應用上使用。
6.2.1加密操作
PBES2的加密操作包括以下幾個步驟,用以使用口令P對訊息M通過金鑰分散KDF和選擇特定的加密方案產生一個密文C:
1.選擇一個噪點S和一個迭代次數c。參照第四章。
2.根據加密方案選擇匯出金鑰的位元組長度dkLen。
3.對口令P,噪點S和迭代次數使用金鑰匯出函式產生一個長度為dkLen的位元組串。
DK = KDF(P,S,c,dkLen)
4.使用既定的加密方案用匯出金鑰DK和訊息M,產生密文C(這個步驟可能設計引數的選擇如初始化向量和填充)
5.輸出密文C
噪點S,迭代次數c和金鑰長度dkLen和金鑰匯出函式以及使用的演算法通過AlgorithmIdentifier值的方式傳遞到解密方。
6.2.2解密操作
PBES2的解密操作通過如下幾個步驟,在口令P的參與下將密文C恢復為訊息M:
1.獲得操作用的噪點S。
2.獲得金鑰匯出的迭代次數c。
3.根據給定的演算法,獲得金鑰的位元組長度dkLen。
4.使用口令P,噪點S,和迭代次數c以及dkLen產生長度為dkLen的匯出金鑰:
DK = KDF(P,S,c,dkLen)
5.用給定的加密演算法使用金鑰DK來恢復訊息M,如果解密演算法輸出“解密錯誤”,輸出“解密錯誤”並停止。
6.輸出恢復的訊息M。
7訊息認證方案
一個訊息認證方案由一個MAC(訊息認證碼)生成操作和一個MAC驗證操作組成,其中的MAC生成操作在一個金鑰的作用下從一個訊息生成一個訊息認證碼,並且MAC驗證操作使用相同的金鑰來認證訊息認證碼。在一個基於口令的訊息認證方案中,金鑰就是口令。
7.1PBMAC1
PBMAC1由一個本版本PKCS#5定義的基於口令的金鑰匯出函式PBKDF2和給定的訊息認證方案(參見附錄B3)組成。金鑰長度和其他的引數依賴於訊息認證方案。
7.1.1MAC生成
PBMAC1使用的MAC生成演算法通過以下的步驟,用口令P和訊息M通過選定的金鑰匯出函式KDF和選定的訊息認證方案生成一個訊息認證碼T。
1.選擇一個噪點S和一個迭代次數c。(參見第四章)
2.根據給定的訊息認證函式,選擇金鑰的長度dkLen。
3.對口令P,噪點S,和迭代次數c使用選定的金鑰匯出函式,生成長度為dkLen的匯出金鑰。
DK = KDF(P,S,c,dkLen).
4.用給定的訊息驗證方案在匯出金鑰DK的作用下,將訊息M生成一個訊息驗證碼T。
5.輸出訊息認證碼T。
噪點S,迭代次數c,金鑰長度dkLen,和金鑰匯出函式以及訊息認證方案的標識通過AlgorithmIdentifier值傳遞給訊息驗證方。
7.1.2MAC驗證
PBMAC1的MAC驗證操作包括以下的步驟,通過訊息M和口令P來驗證訊息驗證碼T:
1.獲得噪點S和迭代次數c。
2.根據特定的訊息認證方案獲得金鑰的位元組長度dkLen。
3.對口令P,噪點S,和迭代次數c使用選定的金鑰匯出函式,生成長度為dkLen的匯出金鑰。
DK = KDF(P,S,c,dkLen).
4.用給定的訊息認證方案在匯出金鑰DK的作用下,驗證訊息M的驗證碼T。
5.如果訊息驗證碼得到驗證,輸出“正確”,否則輸出“錯誤”
附錄AASN.1語法
本章為金鑰匯出函式,加密方案,訊息認證方案定義了ASN.1語法。使用此處定義的應用包括PKCS#8和其它一些金鑰管理,加密資料,資料完整性保護。
物件識別符號pkcs-5標識OID的例項,本節中PKCS#5所有的OID從中派生出。
rsadsi OBJECT IDENTIFIER ::={iso(1) member-body(2) us(840) 113549}
pkcs OBJECT IDENTIFIER ::= {rsadsi 1}
pkcs-5 OBJECT IDENTIFIER ::= {pkcs 5}
A.1PBKDF1
PBKDF1沒有給出物件識別符號,因為PBES1的物件識別符號號對已有應用已經足夠,對新的應用推薦使用PBKDF2。
A.2PBKDF2
物件識別符號id-PBKDF2標識PBKDF2金鑰匯出函式(5.2節)。
id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12}
AlgorithmIdentifier中與這個OID關聯的引數的型別為PBKDF2-params:
PBKDF2-params ::= SEQUENCE {
salt CHOICE {
specified OCTET STRING,
otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}
},
iterationCount INTEGER (1..MAX),
keyLength INTEGER (1..MAX) OPTIONAL,
prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1
}
型別PKDF2-params的屬性有如下的意義:
salt定義了噪點值,或者是噪點值的來源。它應該是一個特定的位元組串或者一個為後續版本保留的型別為PBKDF2-SaltSources的OID。
salt-source方法被設計用於如何產生噪點,以一個演算法ID的引數或者應用資料,或兩者都有。例如,它可能像4.1章建議的那樣,表明了噪點是如何從匯出金鑰的特定資訊部分匯出的。在其它的一些地方可以攜帶一些資訊,例如加密演算法ID。然而這種功能會在PKCS#5的後續版本中提供。在這個版本,一應用可能通過在指定的選擇中指定噪點的描述,達到節4.1提到的好處。
PBKDF2-SaltSources ALGORITHM-IDENTIFIER ::= { ... }
iterationCount定義了迭代次數。最大允許的迭代次數依賴於實現。具體的實現可以做進一步的限制。
keyLength 一個可選的屬性,表示派生金鑰的位元組長度。最大允許的長度依賴於實現,具體的實現可以做進一步的限制。這個屬性的提供僅僅是為了方便。金鑰的長度沒有加密保護,如果要考慮對一個給定的噪點使用不同長度金鑰的互動,噪點應該區分不同的金鑰長度。
prf 標識了給定的偽隨機數生成函式。它應該是屬於PBKDF2-PRFs的一個OID。此版本的PKCS#5定義了包含了algid-hmacWithSHA1(附錄B1.1),其他的方法由應用定義。
PBKDF2-PRFs ALGORITHM-IDENTIFIER ::= { {NULL IDENTIFIED BY id-hmacWithSHA1}, ... }
預設的偽隨機數生成函式是HMAC-SHA1:
algid-hmacWithSHA1 AlgorithmIdentifier {{PBKDF2-PRFs}} ::= {algorithm id-hmacWithSHA1, parameters NULL : NULL}
A.3PBES1
通過指定在金鑰分散中指定雜湊演算法和指定塊演算法的的物件識別符號,標識了PBES1加密方案,如下:
雜湊函式 塊演算法 OID
MD2 DES pkcs-5.1
MD2 RC2 pkcs-5.4
MD5 DES pkcs-5.3
MD5 RC2 pkcs-5.6
SHA-1 DES pkcs-5.10
SHA-1 RC2 pkcs-5.11
pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1}
pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4}
pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3}
pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6}
pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10}
pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11}
對每個OID, 和OID關聯的parameters屬性對應的AlgorithmIdentifier應該屬於PBEParameter型別。
PBEParameter ::= SEQUENCE {
salt OCTET STRING (SIZE(8)),
iterationCount INTEGER
}
型別PBEParameter的屬性有如下的意義:
salt 指定的噪點值,8個位元組的位元組串。
iterationCount 定義了迭代次數。
A.4PBES2
物件識別符號id-PBES2標識了PBES2加密方案。
id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}
在AlgorithmIdentifier中與OID關聯的parameter屬性採用PBES2-params型別:
PBES2-params ::= SEQUENCE {
keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},
encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}
}
PBES2型別的屬性有如下的意義:
keyDerivationFunc表明了使用的金鑰派生函式。它將是集合PKES2-KDFs中的一個OID,對這個版本的PKCS#5應該等於id-PKDF2
PBES2-KDFs ALGORITHM-IDENTIFIER ::= { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }
encryptionScheme表明了使用的加密方案,它將是集合PKES2-Encs中的一個OID,由應用定義,附錄B.2給出了參考演算法。
PBES2wei-Encs ALGORITHM-IDENTIFIER ::= { ... }
A.5PBMAC1
物件識別符號id-PBMAC1標識了PBMAC1訊息認證方案。
id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14}
在AlgorithmIdentifier中與OID關聯的parameters屬性遵從PBMAC1-params型別:
PBMAC1-params ::= SEQUENCE {
keyDerivationFunc AlgorithmIdentifier {{PBMAC1-KDFs}},
messageAuthScheme AlgorithmIdentifier {{PBMAC1-MACs}}
}
keyDerivationFunc屬性和PBES2-params對應的屬性有相同的意義,除了OID是PBMAC1-KDFS。
messageAuthSheme屬性標識了給定的訊息認證方案。它應該是集合PBMAC1-MACs集合中的一個OID,由應用定義,附錄B.3給出了參考演算法。
PBMAC1-MACs ALGORITHM-IDENTIFIER ::= { ... }
B.支援的技術
這章給出了在5,6,7章提到的支援基於口令方案特定的函式和方案的若干參考實現。這些參考的實現還取決於應用,沒有任何是一定要求實現的。當然希望採用PKCS#5開發的應用可以使用支援的技術。
這章也給出了支援技術的物件識別符號。
物件識別符號 digestAlgorithm和encryptionAlgorithm表明了這章演算法OID繼承的根。
digestAlgorithm OBJECT IDENTIFIER ::= {rsadsi 2}
encryptionAlgorithm OBJECT IDENTIFIER ::= {rsadsi 3}
B.1偽隨機數生成函式
PBKDF2使用的偽隨機函式的一個例子是HMAC-SHA-1。
B.1.1 HMAC-SHA-1
HMAC-SHA-1是參照基於SHA-1雜湊演算法的HMAC訊息認證碼的偽隨機函式。偽隨機函式和計算訊息認證碼使用的是相同的方法,使用輸出的全部長度。HMAC-SHA1-1有一個變長的金鑰和一個長度為20位元組的輸出。
儘管HMAC-SHA1-1的金鑰長度基本上不受限制,但有效的偽隨機數查詢空間可能會收到函式結構的限制。特別是,當金鑰長度超過512位元的時候,HMAC-SHA-1將首先將其雜湊為160位元。即使一個長的派生金鑰由口令經過若干偽隨機數函式的輸出組成,有效的偽隨機數查詢空間還知識160位元。儘管其它金鑰長度的限制依賴於HMAC的構建,但應該保證,穩定,有效的搜尋空間限制,金鑰的長度限制在160位元為佳。
(160位元的限制通常情況下在基於口令的加密下不會是一個實際的限制。因為口令的搜尋空間一般不超過160個位元。)
物件識別符號id-hmacWithSHA1標識了HMAC-SHA-1偽隨機數函式:
id-hmacWithSHA1 OBJECT IDENTIFIER ::= {digestAlgorithm 7}
在AlgorithmIdentifier中與OID關聯的parameters屬性的型別是NULL。物件識別符號在集合PBKDF2-PRFs集合中選擇。
B.2加密方案
PBES2使用的例子加密方案是 DES-CBC-Pad, DES-EDE2-CBC-Pad, RC2-CBC-Pad, 和RC5-CBC-Pad.
這章給出的物件識別符號在物件集合PBES2-Encs中選擇。
B.2.1DES-CBC-Pad
DES-CBC-Pad是一個使用CBC模式和RFC1423填充操作(第6.1.1章)的單DES。DES-CBC-Pad有一個8位元組的加密金鑰和一個8位元組的初始向量。金鑰被認為是對DES 56位元金鑰的64位元編碼,校驗位元被忽略。
物件識別符號deCBC定義了DES-CBC-Pad加密方法:
desCBC OBJECT IDENTIFIER ::= {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7}
在AlgorithmIdentifier中的與OID對應的paramters屬性是一個OCTET STRING (SIZE(8))型別,定義了CBC模式的初始向量。
B.2.2DES-EDE3-CBC-Pad
DES-EDE3-CBC是一個使用CBC模式和RFC1423填充操作的三金鑰3DES。DES-EDE3-CBC-Pad有一個24位元組加密金鑰和一個8位元組的初始向量。金鑰被認為3組8位元組的金鑰,每個金鑰為56位元金鑰的64位元編碼,校驗位元被忽略。
AlgorithmIdentifier結構中與OID關聯的parameters屬性的型別是 OCTET STRING (SIZE(8)),定義了CBC模式的初始向量。
注意。非填充的DES-EDE3-CBC的OID在ANSI X9.52中給出;建議使用此處定義的,因為它明確了填充。
B.2.3RC2-CBC-Pad
...
B.2.4RC5-CBC-Pad
...
B.3訊息認證方案
此處給出的PBMAC1的訊息認證方案是HMAC-SHA-1.
B.3.1HMAC-SHA-1
HMAC-SHA-1是基於SHA-1雜湊函式的HMAC訊息認證方案。HMAC-SHA-1有一個可變的金鑰長度和一個20位元組的訊息認證碼。
物件識別符號id-hmacWithSHA-1標明瞭HMAC-SHA-1訊息認證方案。(偽隨機數和訊息認證方案使用相同的OID,結合上下文區分)這個物件識別符號在集合PBMAC1-Macs中獲得。
C.ASN.1模組
...
D.智慧財產權
...
E.版本歷史
Versions 1.0–1.3
Version 1.4
Version 1.5
Version 2.0
F.參考知識
...
G.關於PKCS
...
相關文章
- PKCS#5 v2.0 java 語言實現參考Java
- PKCS #6: Extended- Certificate Syntax Standard (PKCS #6: 擴充套件證書語法標準)套件
- padding oracle attack相關之PKCS #5填充paddingOracle
- PKCS#11:密碼裝置與應用程式的密碼學介面密碼學
- Java DESede 加解密("DESede/ECB/PKCS5Padding")Java解密padding
- Java DES 加解密("DES/CBC/PKCS5Padding")Java解密padding
- PHP 實現 AES-128-CBC-PKCS5Padding 加密PHPpadding加密
- 翻譯:《PKCS#7 - SignedData》
- AES加密 Pkcs7 (BCB模式) java後端版本與JS版本對接加密模式Java後端JS
- PSR-1 Basic Coding Standard 基礎編碼規範 - PHP標準規範PHP
- promise v2.0版本Promise
- 密碼管理規範密碼
- [密碼學複習]Cryptography密碼學
- Mouse Odometer v2.0破解(入門) (5千字)
- 一個基於ThinkPHP5的CMS系統PHP
- 【重磅】四部門聯合印發《公共資源交易平臺系統資料規範(V2.0)》
- 基於 HTML5 WebGL 的垃圾分類系統HTMLWeb
- 基於 HTML5 Canvas 的樓宇自控系統HTMLCanvas
- 基於HTML5WebGL的地鐵管理系統HTMLWeb
- 青春部落格-V2.0版本
- 圖床「神器」PicGo v2.0更新,外掛系統終於來了圖床PicGo
- 5. SQL 編寫規範SQL
- websocket(html5新規範)WebHTML
- Java DES 加解密("DES/ECB/PKCS1Padding")Java解密padding
- 用 git 鉤子,檢測程式碼規範性(eslint、standard)GitEsLint
- 答答租車系統規範程式碼示例
- 開源線上客服系統(支援H5的線上客服系統原始碼基於PHP)H5原始碼PHP
- AirNet系統扇區修改說明.V2.0AI
- 基於 WebGL 的 HTML5 3D 工控裙房系統WebHTML3D
- 基於thinkphp5+layui開的CLTPHP內容管理系統PHPUI
- 基於 HTML5 WebGL 的 3D 工控裙房系統HTMLWeb3D
- 程式碼分支及版本管理規範
- 基於 HTML5 + WebGL 的太陽系 3D 展示系統HTMLWeb3D
- 15、基於psexec的域滲透測試工具—Smbexec v2.0
- PKCS#3 v1.4 java 語言實現參考Java
- 【開源】夢雪實體小店收款系統 v2.0
- EacooPHP基於ThinkPHP5+AdminLTE後臺管理系統OOPPHP
- 基於MybatisPlus程式碼生成器(2.0新版本)MyBatis