PKCS #5: Password-Based Cryptography Specification Version 2.1 中文翻译

PKCS#5 基于口令的加密规范V2.1
摘要:
本文档提供了实现基于密码的加密的建议,包括密钥派生函数、加密方案、消息验证方案和ASN.1语法识别技术。
本文档是RSA实验室公钥密码标准(PKCS)系列中的PKCS #5 v2.1的再版。通过RFC发布,变更控制被转移到IETF。
该文件也废止了RFC 2898。
备忘录状态
本文档不是Internet标准跟踪规范;它的出版是为了提供信息。
本文档是IETF (Internet Engineering Task Force)的产品。它代表了IETF团体的共识。它已接受公众审查,并已获互联网工程指导小组(IESG)批准出版。并非所有经IESG批准的文件都可以用于任何级别的互联网标准;参见RFC 7841第2节。
有关此文档的当前状态、任何勘误表以及如何对其提供反馈的信息,可在以下网址获得
http://www.rfc-editor.org/info/rfc8018。

Table of contents目录
1 Introduction 介绍
2 Notations 符号
3 Overview 概述
4 Salt and Iteration count Salt和迭代次数
4.1 Salt
4.2 Iteration Count 迭代次数
5 Key Derivation Functions 密钥派生函数
5.1. PBKDF1
5.2 PBKDF2
6 Encryption Schemes 加密方案
6.1. PBES1
6.1.1. PBES1 Encryption Operation PBES1 加密操作
6.1.2. PBES1 Decryption Operation PBES1解密操作
6.2. PBES2
6.2.1. PBES2 Encryption Operation PBES2 加密操作
6.2.2. PBES2 Decryption Operation PBES2 解密操作
7. Message Authentication Schemes 消息认证方案
7.1. PBMAC1
7.1.1. PBMAC1 Generation Operation PBMAC1 生成操作
8. Security Considerations 安全注意事项

1 Introduction 介绍

本文档提供了实施基于密码的密码学的建议,包括以下方面:
 密钥派生函数
 加密方案
 消息认证方案
 ASN.1语法识别技术
这些建议打算在计算机和通信系统内普遍应用,因此具有相当大的灵活性。它们特别用于保护敏感信息,如pkcs# 8 [PKCS8] [RFC5958]中的私钥。预期基于这些规范的应用程序标准和实现概要文件可能包括额外的约束。

2 Notations 符号

C 密文,一个字节字符串
c 迭代计数,一个正整数
DK 派生的密钥,一个以字节为单位字符串
dkLen派生密钥的字节长度,一个正整数
EM 编码后的消息,一个以字节为单位字符串
Hash 下文描述的Hash函数
hLen 伪随机函数输出的字节长度,一个正整数
l 派生密钥的块长度,为正整数
IV 初始化向量,字节为单位字符串
K 加密密钥,字节为单位字符串
KDF 密钥派生函数
M 消息,字节为单位字符串
P 口令,字节为单位字符串
PRF 下文描述的伪随机数函数
PS 填充字符串,字节为单位字符串
S Salt随机数,字节为单位字符串
T 消息验证码,字节字符串
T_1, …, T_l, U_1, …, U_c 中间值,字节字符串
01, 02, …, 08 字节值为1,2,…, 8
\xor 两个字节字符串的逐位异或
|| || 字节体长度运算符
|| 连接符
<i…j> 子串提取运算符:提取字节从I到j,0 <= I <= j。

3 Overview 概述

在许多公钥加密应用程序中,用户安全性最终依赖于一个或多个秘密文本值或口令。
但是,由于口令不是直接适用于任何传统密码系统的密钥,因此需要对口令进行一些处理才能使用它执行加密操作。此外,由于口令通常是从一个相对较小的空间中选择的,因此在处理过程中需要特别小心,以防范搜索攻击。
另一种基于密码的密码学方法是构造相对昂贵的密钥派生技术,从而增加穷举搜索的成本。一种方法是在密钥派生技术中包含迭代计数,指示派生密钥的某个底层函数要迭代多少次。适度的迭代次数(比如1000次)在计算密钥时对合法方来说不太可能是一个负担,但对反对者来说将是一个很大的负担。
Salt和迭代计数构成了PKCS #5 v2.0中基于口令的加密的基础,这里也用于各种加密操作。因此,这里定义的基于口令的密钥派生是口令、Salt和迭代计数的函数,后两个数无需保密。
通过基于口令的密钥派生函数,可以很容易地定义基于口令的加密和消息身份验证方案。在PKCS #5 v2.0中,这里的基于口令的加密方案是基于一种底层的常规加密方案,
其中,常规方案的密钥来自口令。类似地,基于口令的消息认证方案是基于底层的常规方案。这种两层的方法使基于口令的技术模块化,因为它们可以基于底层技术。
希望基于口令的密钥派生函数可以找到这里定义的加密和消息身份验证方案之外的其他应用。例如,一种可能可以通过一个密钥推导函数的应用来推导一组密钥,而不是在每个单独应用中的函数派生每个密钥。集合中的密钥将作为密钥派生函数输出的子字符串获得。在面向会话的协议中,这种方法可以作为密钥建立的一部分。另一个应用程序是口令检查,其中存储键派生函数的输出(以及Salt和迭代计数),以便后续对口令进行验证。
在整个文档中,密码被认为是一个任意长度的字节字符串,其文本字符串的解释是未指定的。然而,为了实现互操作性,建议应用程序遵循一些通用的文本编码规则。
ASCII和UTF-8 [RFC3629]是两种可能性。(ASCII是UTF-8的子集。)
虽然口令的选择超出了本文档的范围,但是已经发布的指南[NISTSP63]可能会被考虑进去。

4 Salt and Iteration count Salt和迭代次数

由于Salt和迭代计数是本文中定义的技术核心,因此有必要进行进一步的讨论。

4.1 Salt

在基于口令的密码学中,Salt传统上用于生成一组与给定口令相对应的密钥,根据Salt随机选择其中一个密钥。通过应用密钥派生函数KDF选择集合中的一个密钥,如
DK = KDF (P, S)
其中DK为派生密钥,P为密码,S为salt。
这有两个好处:
1。对手很难预先计算出与口令字典相对应的所有密钥,甚至是最有可能的密钥。例如,如果salt长度为64位,那么每个口令将有多达2^64个密钥。因此,在执行了基于口令的操作并知道口令的salt之后,对手只能搜索口令。
2。同样的密钥不太可能被选中两次。同样,根据生日悖论,如果Salt是64位长,密钥之间的“碰撞”的概率不会变得显著,直到大约2^32个密钥产生。不太可能发生冲突的事实解决了在使用某些加密和身份验证技术时可能出现的对同一密钥的多次使用之间的交互的一些问题。
在基于口令的加密中,对消息进行加密的一方可以确保,只要在从口令派生加密密钥时选择一个大的、足够随机的salt,就可以实现这些好处。生成消息身份验证码的一方可以以类似的方式获得这种保证。
然而,解密消息或验证消息验证码的一方不能确定另一方提供的Salt实际上是随机生成的。例如,Salt可能是从另一个基于口令的操作中复制来的,目的是利用同一个密钥的多次使用之间的交互。例如,假设两个合法方交换加密的消息,其中加密密钥是一个80位的密钥,派生自一个带有一些Salt的共享口令。对手可以从加密中获取信息,并将其提供给其中一方,就像它是一个40位密钥一样。如果一方透露了用40位密钥解密的结果,对方可能就能解出40位密钥。在40位密钥是80位密钥的前半部分的情况下,对手可以很容易地求出80位密钥的剩余40位。
要防范这种攻击,要么应该仔细分析同一个密钥的多次使用之间的交互,要么salt应该包含明确区分不同操作的数据。例如,salt可能有一个额外的、非随机的字节,用于指定派生密钥是用于加密、消息身份验证,还是用于其他操作。
基于此,推荐以下Salt选择:
1. 如果没有关注多个使用相同密钥之间的相互作用(或密钥前缀)口令的加密和认证技术支持对于一个给定的口令,然后随机生成的Salt的特定格式可能不需要由Salt接收方检查。它应该至少有8个字节(64位)长。
2. 否则,Salt应该包含明确区分不同操作和不同密钥长度的数据,此外还有一个至少8字节长的随机部分,接收Salt的一方应该检查或重新生成该数据。例如,salt可以有一个额外的非随机字节,用于指定派生密钥的用途。或者,它可以是指定有关派生密钥的详细信息的结构的编码,例如加密或身份验证技术,以及从密码派生的不同密钥之间的序列号。附加数据的特定格式留给应用程序。
注意:如果随机数生成器或伪随机生成器不可用,则用于生成salt(或其随机部分)的一种确定性替代方法是对要处理的密码和消息M应用基于口令的密钥派生函数。例如,Salt可以与一个密钥计算推导函数S = KDF (P、M)。这种方法不推荐如果消息M是属于一个小消息空间(例如,“是”或“否”),但是,自那以后可能只会有少量的Salt。

4.2 Iteration Count 迭代次数

迭代计数通常用于增加从密码生成密钥的成本,因此也会增加
攻击的难度。从数学上讲,c的迭代次数将使密码的安全强度增加log2©位,以抵御基于尝试的攻击,如暴力破解或字典攻击。
为迭代计数选择一个合理的值取决于环境和具体情况,并且因应用程序而异。本文档遵循FIPS特别出版物800-132 [NISTSP132]中提出的建议
只要用户可以接受使用输入的口令生成密钥所需的时间,迭代次数应尽可能大。[…建议最小迭代次数为1000次。对于特别关键的密钥,或者对于非常强大的系统,或者用户感知的性能不是关键的系统,10,000,000的迭代计数可能是合适的。

5 Key Derivation Functions 密钥派生函数

密钥派生函数从基本密钥和其他参数生成派生密钥。在一个基于口令的密钥派生函数中,基本密钥是口令,其他参数是salt值和迭代计数,如第3节所述。
这里定义的基于口令的密钥派生函数的主要应用是在第6节和的加密方案中和第7节中的消息认证方案。当然也可以使用其他应用程序,因此可以独立定义这些函数。
本节指定了两个函数:PBKDF1和PBKDF2。PBKDF2推荐应用于新应用;PBKDF1只与现有应用程序兼容,不推荐用于新应用。
这里定义的密钥派生函数的典型应用可能包括以下步骤:
1。选择salt S和迭代计数c,如第4节所述。
2。为派生密钥dkLen选择以字节为单位的长度。
3。将密钥派生函数应用于口令、Salt、迭代计数和密钥长度,以生成派生密钥。
4。输出派生的键。
任何数量的密钥都可以通过改变salt然后从密码中派生出来,如第3节所述。

5.1. PBKDF1

PBKDF1使用哈希函数MD2 [RFC1319]、MD5 [RFC1321]或SHA-1 [NIST180]来派生密钥。派生密钥的长度受哈希函数输出的长度限制,MD2和MD5为16个字节,SHA-1为20个字节。PBKDF1与PKCS# 5 v1.5 [PKCS5_15]中的密钥派生过程兼容。
因为PBKDF1生成的密钥对某些应用程序来说可能不够大,所以只推荐它与现有应用程序兼容。
PBKDF1 (P, S, c, dkLen)
Options: Hash underlying hash function
Input: P password, an octet string
S salt, an octet string
c iteration count, a positive integer
dkLen intended length in octets of derived key, a positive integer, at most 16 for MD2 or MD5 and 20 for SHA-1
Output: DK derived key, a dkLen-octet string.
Steps:

  1. If dkLen > 16 for MD2 and MD5, or dkLen > 20 for SHA-1, output “derived key too long” and stop.
  2. Apply the underlying hash function Hash for c iterations to the concatenation of the password P and the salt S, then extract the first dkLen octets to produce a derived key DK:
    T_1 = Hash (P || S) ,
    T_2 = Hash (T_1) ,

    T_c = Hash (T_{c-1}) ,
    DK = T_c<0…dkLen-1>
    3. Output the derived key DK.

5.2 PBKDF2

PBKDF2应用一个伪随机函数(参见附录B.1的示例)来派生密钥。派生密钥的长度基本上是无边界的。(然而,衍生密钥的最大有效搜索空间可能会受到底层伪随机函数结构的限制。详见附录B.1。)对于新的应用,建议使用PBKDF2。
PBKDF2 (P, S, c, dkLen)
Options: PRF underlying pseudorandom function (hLen denotes the length in octets of the
pseudorandom function output)
Input: P password, an octet string
S salt, an octet string
c iteration count, a positive integer
dkLen intended length in octets of the derived
key, a positive integer, at most (2^32 - 1) * hLen
Output: DK derived key, a dkLen-octet string
Steps:
1. If dkLen > (2^32 - 1) * hLen, output “derived key too long” and stop.
2. Let l be the number of hLen-octet blocks in the derived
key, rounding up, and let r be the number of octets in the
last block:
l = CEIL (dkLen / hLen)
r = dkLen - (l - 1) * hLen
Here, CEIL (x) is the “ceiling” function, i.e., the smallest integer greater than, or equal to, x.
3. For each block of the derived key apply the function F
Defined below to the password P, the salt S, the iteration count c,and the block index to compute the block:
T_1 = F (P, S, c, 1),
T_2 = F (P, S, c, 2),

T_l = F (P, S, c, l),
where the function F is defined as the exclusive-or sum of the
first c iterates of the underlying pseudorandom function PRF
applied to the password P and the concatenation of the salt S
and the block index i:
F (P, S, c, i) = U_1 \xor U_2 \xor … \xor U_c
where
U_1 = PRF (P, S || INT (i)),
U_2 = PRF (P, U_1),

U_c = PRF (P, U_{c-1}).
Here, INT (i) is a four-octet encoding of the integer i,
most significant octet first.
4. Concatenate the blocks and extract the first dkLen octets to produce a derived key DK:
DK = T_1 || T_2 || … || T_l<0…r-1>
5. Output the derived key DK.
注意:函数F的构造遵循“皮带和吊带”的方法。迭代U_i将递归计算,以消除对手的并行程度;它们被排他在一起,以减少递归值退化为一个小的集合的担忧。

6 Encryption Schemes 加密方案

在对称设置中,加密方案由加密操作和解密操作组成,其中加密操作用密钥加密消息生成密文,解密操作用相同的密钥解密密文恢复消息。 在基于口令的加密方案中,口令就是密码。
基于口令的加密方案的典型应用程序是一种私有密钥保护方法,其中消息包含私有密钥信息,如PKCS#8。这里定义的加密方案将是该上下文中合适的加密算法。
本节指定了两个方案:PBES1和PBES2。PBES2适用于新应用;PBES1仅用于兼容现有的应用程序,不建议用于新应用程序。

6.1. PBES1

PBES1结合了PBKDF1函数(章节5.1)和底层分组密码,该分组密码应为DES [NIST46]或RC2 [RFC2268]
推荐使用PBES1只是为了与现有应用程序兼容,因为它只支持两种底层加密方案,每种方案的密钥大小(56或64位)对于某些应用程序来说可能不够大。

6.1.1. PBES1 Encryption Operation PBES1 加密操作

PBES1的加密操作包括以下步骤,用口令P对消息M进行加密,生成密文C:
1. 选择8字节的Salt S和迭代计数c,如第4节所述。
2. 将PBKDF1密钥派生函数(第5.1节)应用于口令P、Salt S和迭代计数c,生成一个长度为16字节的派生密钥DK:
DK = PBKDF1 (P, S, c, 16)
3. 将派生出的密钥DK分割为由DK的前八个字节组成的加密密钥K和由后八个字节组成的初始化向量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, if ||M|| mod 8 = 7;
PS = 02 02, if ||M|| mod 8 = 6;

PS = 08 08 08 08 08 08 08 08, if ||M|| mod 8 = 0.
编码后的消息的八位字节长度将是8的倍数,并且可以从编码后的消息明确地恢复消息M。(此填充规则来自RFC1423 [RFC1423]。)
5. 加密编码信息EM与底层块密码(DES或RC2)在CBC模式加密密钥和初始化向量K IV产生密文C,对于DES,应当视为密钥64位K编码的56位,密钥带有奇偶校验位忽略(见[NIST46])。对于RC2,“有效密钥位”应为64位。
6. 输出密文C。
Salt S和迭代计数c可以在算法标识符值中传递给执行解密的一方(见附录A.3)。
6.1.2. PBES1 Decryption Operation PBES1解密操作
PBES1的解密操作包括以下步骤,解密口令P下的密文C,恢复消息M:
1. 得到八字节Salt S和迭代计数c。
2. 将PBKDF1密钥派生函数(第5.1节)应用于密码P、盐S和迭代计数c,生成一个长度为16字节的派生密钥DK:
DK = PBKDF1 (P, S, c, 16)
3. 将导出的密钥DK分割为由DK的前八个字节组成的加密密钥K和由后八个字节组成的初始化向量IV:
K = DK<0…7>,IV = DK<8…15>
4. 解密密文C与底层块密码(DES或RC2)在CBC模式下的加密密钥K和初始化向量IV编码信息恢复。如果密文的字节长度C不是8的倍数,输出“解密错误”并停止。
5. 将编码后的消息EM分离成消息M和填充字符串PS: EM = M || PS
6. 输出恢复后的报文M:

6.2. PBES2

PBES2结合了一个基于口令的密钥派生函数,对于这个版本的PKCS #5,它应该是PBKDF2(5.2节),以及一个底层的加密方案(示例见附录B.2)。下述加密方案的密钥长度和任何其他参数取决于该方案。
对于新的应用程序,建议使用PBES2

6.2.1. PBES2 Encryption Operation PBES2 加密操作

PBES2的加密操作包括以下步骤,应用选定的密钥派生函数KDF和选定的底层加密方案,用口令P对消息M进行加密,生成密文C:
1. 选择salt S和迭代计数c,如第4节所述。
2. 为加密方案的派生密钥选择以字节为单位的长度dkLen。
3. 将选定的密钥派生函数应用于密码P、盐S和迭代次数c,生成长度为dkLen字节的派生密钥DK: DK = KDF (P, S, c, dkLen)
4. 使用底层加密方案在派生密钥DK下加密消息M,生成密文c(这一步可能涉及参数的选择,如初始化向量和填充,取决于底层方案)。
5. 输出加密报文C.
Salt S、迭代计数c、密钥长度dkLen、密钥派生函数的标识符和底层加密方案可以以算法标识符值传递给执行解密的一方(参见附录A.4)。

6.2.2. PBES2 Decryption Operation PBES2 解密操作

PBES2的解密操作包括以下步骤,解密口令P下的密文C,恢复消息M:
1. 获得操作所需的Salt S。
2. 获得密钥派生函数的迭代计数c。
3. 为基础加密方案的派生密钥获取以字节为单位的密钥长度dkLen。
4. 将选定的密钥派生函数应用于口令P、Salt S和迭代次数c,生成长度为dkLen字节的派生密钥DK: DK = KDF (P, S, c, dkLen)
5. 用派生密钥DK下的底层加密方案对密文C进行解密,恢复消息m。如果解密函数输出“解密错误”,则输出“解密错误”并停止。
6. 输出恢复报文M。

7. Message Authentication Schemes 消息认证方案

消息认证方案包括MAC (message authentication Code)生成操作和MAC验证操作,其中MAC生成操作根据一个密钥从消息中生成一个MAC, MAC验证操作采用相同的密钥对消息进行验证。在基于密码的消息认证方案中,密钥就是口令。
本节只介绍一种方案:PBMAC1。

7.1. PBMAC1

PBMAC1结合了一个基于密码的密钥派生函数,对于这个版本的PKCS #5,该函数应该是PBKDF2(第5.2节),以及一个底层的消息验证方案(参见附录B.3中的示例)。消息身份验证方案的密钥长度和任何其他参数取决于该方案。

7.1.1. PBMAC1 Generation Operation PBMAC1 生成操作

PBMAC1的MAC生成操作包括以下步骤,对口令为P的消息M进行处理,生成消息验证码T,应用选定的密钥派生函数KDF和选定的底层消息验证方案:
1. 选择salt S和迭代计数c,如第4节所述。
2. 为基础消息身份验证函数的派生密钥选择以字节为单位的密钥长度dkLen。
3. 将选定的密钥派生函数应用于口令P、Salt S和迭代次数c,生成长度为dkLen字节的派生密钥DK:
4. 用派生密钥DK下的底层消息认证方案对消息M进行处理,验证消息验证码T。
5. 如果消息验证码经过验证,则输出“正确”;其他则输出“不正确”。

8. Security Considerations 安全注意事项

基于口令的密码学所能提供的安全性通常是有限的,特别是对于像本文档中定义的那些可以进行离线密码搜索的方法。虽然salt和迭代计数的使用会增加攻击的复杂性(请参阅第4节的建议),但口令的适当选择是必要的,并且应该考虑相关的指导方针(例如,[NISTSP63])。同样重要的是在存储口令时,保护好口令。
通常,对于不同的用途,应该从口令中派生出不同的密钥,以尽量减少意外交互的可能性。对于使用单一算法的基于口令的加密,一个随机Salt就足以确保将产生不同的密钥。在某些情况下,如第4节所述,结构Salt是必要的。因此,在选择Salt值时应考虑到第4节中的建议。
有关MD2 [RFC1319]安全注意事项的信息,请参见[RFC6149];MD5 [RFC1321],见[RFC6151];SHA-1 [NIST180]参见[RFC6194]。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值