Password-Based Key Derivation Functions (PBKDF)

概述

KDF是一种确定性算法,用于从秘密值(如密码)派生加密密钥材料。家族中的每个PBKDF由选择的伪随机函数(PRF)和固定的迭代计数(记为C)定义。执行PBKDF的输入包括密码(记为P)、盐(记为S)和MK所需的比特长度(记为kLen)。记作:
mk = PBKDF(PRF, C) (P, S, kLen).
kLen 值长度至少为112bit.
图1给出了PBKDF的通用图。通用PBKDFs的设计原理见附录A.2。
Password-Based Key Derivation Functions (PBKDF)_第1张图片
Figure 1: A generic diagram of the PBKDF

盐 (S)

全部或部分盐应使用批准的随机位生成器生成。所述盐的随机生成部分的长度至少为128位。
关于盐的长度和可选格式的更多信息可在附录A.2.1中获得。

迭代次数(C)

迭代次数C是一个固定的值,它决定了PRF迭代生成MK的一个块的次数。迭代次数应尽可能大,只要用户可以接受使用输入的密码生成密钥所需的时间。由于用户机器的能力不同(例如,从智能卡到高端工作站或服务器),合理的迭代计数也相应不同。建议最小迭代数为1000。对于特别关键的密钥,或者非常强大的系统,或者用户感知的性能并不重要的系统,10,000,000次迭代计数可能是最好的。
关于迭代计数选择的更多信息可以在附录A.2.2中找到。

PBKDF规范

下面从密码推导MK的算法基于[6]中指定的算法,其中指定为PBKDF2,并使用HMAC[1]和SHA-1作为PRF。本建议批准PBKDF2作为PBKDF,使用HMAC和任何批准的哈希函数作为PRF。以位为单位的哈希函数的摘要大小表示为hLen。
下面给出了PBKDF算法的细节。

Password-Based Key Derivation Functions (PBKDF)_第2张图片
Password-Based Key Derivation Functions (PBKDF)_第3张图片
PBKDF概图

使用派生的主密钥保护数据

在本节中,将提供两种使用MK保护数据的选项。在这两种选项中,都使用DPK保护存储的数据,并且需要验证DPK的正确性。图3总结了使用这两个选项访问受保护数据(或对数据应用保护)的基于密码的密钥派生的一般过程。
请注意,如果DPK被泄露,则有必要使用新密码和/或新的DPK恢复(例如,解密)数据并重新保护(例如,重新加密)该数据。

Option 1:
在这个选项中,有两种方法从MK中派生DPK:
1a:MK(或MK的一部分)直接用作DPK,
1b:DPK使用KDF从MK中派生。
注意,DPK可能是一组用于加密和完整性的密钥。
如果仅对明文数据进行加密,且数据大小较大,为了在不解密存储介质上的整个数据的情况下检测密码输入错误,可能会在加密之前在明文数据前加上一个前缀值(例如一串0)。如果使用这种方法,则通过解密包含前缀值的密文数据部分,并将结果与前缀的期望值进行比较来检查密码。
修改密码会导致关联的DPK发生变化。因此,每当密码被更改时,应使用与退出密码相关联的适当DPK恢复(例如,解密)受退出密码保护的任何数据,然后使用与修改后的密码相关联的适当DKP重新保护(例如,加密)。
Password-Based Key Derivation Functions (PBKDF)_第4张图片
用于访问受保护数据或对数据应用保护的密钥派生过程。
Option 2:
在第二个选项中,随机生成的dpk通过以下两种方式之一得到保护。
2a:由密码生成的MK(或MK的一部分)直接用于保护DPK。
2b:由密码生成的MK(或MK的一部分)用于使用批准的KDF派生密钥材料,派生密钥材料(或派生密钥材料的一部分)用于保护DPK。
保护DPK的手段应使用经批准的认证加密模式,或结合nist批准的认证方案使用nist批准的加密算法/模式。
使用经过批准的认证加密模式或等效组合,可以检测到不正确的MK或不正确的派生密钥材料,进而检测到不正确的密码,从而避免使用不正确的DPK解密受保护数据的漫长过程。根据用于保护DPK的方法,除了盐和计数器之外的数据(例如,初始化向量)可能需要用于解密和加密用途(参见附录A.3)。
对于选项2a和2b,修改密码将改变保护关联DPK的密钥。因此,每当密码被更改时,应使用MK或与退出密码相关联的派生密钥材料恢复(例如,解密)受退出密码保护的任何DPK,然后使用与新密码相关联的适当MK或派生密钥材料重新保护(例如,加密)。

A.1 用户选择的 Passwords

密码或密码短语是用于访问受限资源的秘密字符串。当使用密码生成加密密钥时,假定攻击者能够使用自己选择的系统对密钥派生过程执行脱机搜索攻击,该系统可能比授权用户使用密码生成密钥的系统强大得多。此外,这种攻击是可并行的。因此,密码中的熵(粗略地说,攻击者平均需要猜测的次数来确定密码)是至关重要的。
随机生成的密码通常比用户选择的相同长度的密码具有更高的熵。然而,在许多应用程序中,密码是由用户选择的,因为很难记住随机生成的密码。为了电子存储数据的安全性,密码应该足够强,这样攻击者就不可能通过猜测密码获得访问权限。密码的强度与其长度和随机性有关。短于10个字符的密码通常被认为是弱密码。还有许多其他属性可能使密码变得弱。例如,不建议使用数字序列或字母序列作为密码。容易访问的个人信息,如用户姓名、电话号码和出生日期,不应直接用作密码。
密码短语通常只由字母组成,但它们比密码长得多,通常为20到30个字符,弥补了它们熵的不足。短于20个字符的密码短语通常被认为是弱的。
A.2 PBKDF
字典攻击的目的是通过尝试最有可能的字符串来恢复密码,比如字典中的单词。对于包含大小写字母和数字随机组合的密码,这些攻击不太可能成功。这样的密码只能通过低效的暴力攻击来恢复,这种攻击会尝试所有可能的密码。
PBKDF的主要思想是通过增加测试每个密码所需的时间来减缓字典或暴力破解密码的攻击。具有可能密码列表的攻击者可以使用已知的迭代计数器和salt计算PBKDF。由于攻击者每次尝试都必须花费大量的计算时间,因此应用字典或蛮力攻击变得更加困难。

A.2.1 盐Salt的长度

salt的目的是允许生成与每个密码对应的大型密钥集,用于固定的迭代计数。对于给定的密码,可能产生的密钥数量大约为2sLen,其中sLen是盐的长度(以位为单位)。因此,使用salt使得攻击者很难生成结果密钥表,即使是最可能的密码的一小部分。
可选地,为了避免使用盐的其他应用程序之间的任何可能的交互,可以将应用程序、消息或用户特定的变量purpose添加到盐的随机生成部分前面,如下所示;
S = purpose || rv.

A.2.2 Iteration Count 迭代次数C

迭代计数C的目的是增加从密码中获得密钥所需的计算量,从而显著增加字典攻击的工作负载。使用需要C次迭代来获得密钥的PBKDF增加了对具有t位熵的密码执行字典攻击的计算成本,从2t操作增加到C2t操作,因此,使字典和暴力攻击更加困难。
但是,合法用户导出密钥所需的计算也会随着迭代次数的增加而增加。用户可能会察觉到这种增加,例如,身份验证所需的时间增加了,或者访问存储介质上受保护数据的时间增加了。这里有一个明显的权衡:更大的迭代次数会使攻击成本更高,但会损害授权用户的性能。迭代次数应该设置为环境所能容忍的最高,同时保持可接受的性能。
可接受的性能是系统进行密钥推导和应用程序的能力的函数。例如,考虑一个从加密驱动器引导笔记本电脑的“整个磁盘”驱动器加密应用程序,这是一个相当常见的基于密码的密钥推导应用程序。整个冷启动过程,从打开笔记本电脑到加载系统并可供使用,可能需要30秒到2分钟,并涉及操作系统级别的用户身份验证,以及启动密码的输入。系统冷启动是相对不常见的事件。在这样的应用程序中,在目标机器上设置需要一秒的迭代计数是合理的,因为引入的延迟与总体启动时间相比很小。
在另一个极端,假设要为特定的事务根据需要创建一个密钥,并且用户可能在一小时内执行多次此操作。独立于密码输入和密钥推导而打开文件的时间只有一两秒钟。在这种情况下,从密码派生密钥的延迟超过一秒将是明显的,对用户来说是讨厌的。这表明迭代计数在目标机器上的增加不应超过四分之一秒。
如果要在服务器上执行密钥推导,则性能可能更难衡量,并且可能取决于服务器的峰值负载。然而,在许多情况下,即使在服务器上,对于一个长会话,密钥推导也只执行一次,在这些情况下,密钥推导的几秒钟的用户表观延迟可能是可以容忍的。

A.3 DPK保护

使用经过认证的加密方案或nist批准的加密算法/模式,结合nist批准的身份验证方案,旨在保护DPK的真实性和保密性。例如,在选项2中(请参阅第5.4节),可以使用经过身份验证的加密方案保护DPK。如果用户输入错误的密码,则无法生成正确的MK。但是,使用错误的MK将导致在恢复DPK的身份验证过程中失败。
使用[3,4]中指定的机制恢复DPK所需的额外变量(例如,初始化向量,密钥长度)可以存储在硬盘驱动器或其他存储设备上。保护这些额外的变量是不必要的。

参考:NIST SP 800-132

你可能感兴趣的:(密码学,网络,服务器,安全)