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
...