3. Overview (概述)
3. Overview (概述)
在公钥密码学的许多应用中, 用户安全最终依赖于一个或多个秘密文本值或口令。然而, 由于口令不能直接作为任何传统密码系统的密钥使用, 因此需要对口令进行一些处理才能使用它执行密码操作。此外, 由于口令通常从相对较小的空间中选择, 在该处理过程中需要特别注意以防御搜索攻击。
Morris 和 Thompson [MORRIS] 为保护口令表所描述的基于口令的密码学的一般方法是将口令与盐值 (salt) 结合以产生密钥。盐值可以被视为从口令派生的大量密钥集的索引, 并且不需要保密。虽然对手可能构造可能口令的表 (所谓的 "字典攻击"), 但构造可能密钥的表将是困难的, 因为每个口令将有许多可能的密钥。因此, 对手将被限制为针对每个盐值分别搜索口令。
基于口令的密码学的另一种方法是构造相对昂贵的密钥派生技术, 从而增加穷举搜索的成本。一种实现方法是在密钥派生技术中包含迭代次数 (iteration count), 指示迭代某个底层函数的次数, 通过该函数派生密钥。适量的迭代次数 (例如 1000) 在计算密钥时对合法方不太可能是负担, 但对对手来说将是显著的负担。
盐值和迭代次数构成了 PKCS #5 v2.0 中基于口令的加密的基础, 并在此处也被采用用于各种密码操作。因此, 此处定义的基于口令的密钥派生是口令、盐值和迭代次数的函数, 其中后两个量不需要保密。
从基于口令的密钥派生函数, 可以直接定义基于口令的加密和消息认证方案。与 PKCS #5 v2.0 一样, 此处的基于口令的加密方案基于底层的传统加密方案, 其中传统方案的密钥从口令派生。类似地, 基于口令的消息认证方案基于底层的传统方案。这种双层方法使基于口令的技术在其所基于的底层技术方面具有模块化。
预期基于口令的密钥派生函数可能会找到除此处定义的加密和消息认证方案之外的其他应用。例如, 可以通过密钥派生函数的单个应用派生一组密钥, 而不是通过函数的单独应用派生每个密钥。集合中的密钥将作为密钥派生函数输出的子串获得。这种方法可以作为面向会话的协议中密钥建立的一部分使用。另一个应用是口令检查, 其中存储密钥派生函数的输出 (连同盐值和迭代次数) 以用于后续验证口令。
在整个文档中, 口令被认为是任意长度的八位字节串, 其作为文本字符串的解释未指定。然而, 为了互操作性, 建议应用程序遵循一些通用的文本编码规则。ASCII 和 UTF-8 [RFC3629] 是两种可能性。(ASCII 是 UTF-8 的子集。)
虽然口令的选择不在本文档的范围内, 但已发布的指南 [NISTSP63] 可能值得考虑。