PKCS #5: 基于口令的密码系统规范 版本2.0( 二 )


进行密码操作 。此外,由于口令通常是从一个相对小的空间选取的,处理中要求非凡的
考虑以防止搜索攻击 。
基于口令的密码术的一个通用方法,由Morris和Thompson描述,用于口令表的保
护,是把口令与盐结合以产生密钥 。可把盐看作是对从口令导出的一个大密钥集合的索
引,不需要保密 。尽管攻击者有可能构造一个可能口令表(称作“字典攻击”),但构造
一个可能密钥表是很困难的,因为每个口令将有许多可能的密钥 。对手将不得不为每一
个盐单独搜索口令 。
基于口令的密码术的另一个方法是构建相对昂贵的密钥导出技术,由此增加穷举搜
索的代价 。作法之一是在密钥导出技术中包括一个迭代次数,指示迭代多少次密钥导出
的一些基本函数 。一个适度的迭代次数,比如说1000,对合法方来说不可能是计算密
钥时的负担,但对对手来说是一个很大的负担 。
盐和迭代次数构成了PKCS#5v1.5中基于口令加密的基础,在这里同样为各种密
码操作所采用 。这样,这里定义的基于口令的密钥导出是口令、盐和迭代次数的一个函
数,其中后两个量不需要保密 。
从基于口令的密钥导出函数,定义基于口令的加密和消息鉴别方案就简单了 。正如
PKCS#5v1.5中,这里的基于口令的加密方案是基于一个基本的、传统加密方案,传统
方案的密钥是从口令导出的 。相似地,基于口令的消息鉴别方案也基于一个基本的传统
方案 。这两个层次的方法使基于口令的技术按照基于的基础技术模块化 。
期待基于口令的密钥导出函数找到除了这里定义的加密和消息鉴别方案以外的其
它应用 。比如,用密钥导出函数的一个单个应用导出一个密钥集合 。集合中的密钥作为
密钥导出函数的输出的子串得到 。该方法可在面向会话的协议中用作密钥建立的一部
分 。另外一个应用是口令检查,密钥导出函数的输出被存储(同盐和迭代次数一道)用于
后续的验证口令的目的 。
在本文档中,口令被视作一个任意长度的字节串,对其作为文本串的解释不作指定 。
但为了互操作性,建议应用遵循某些通用的文本编码规则 。ASCII和UTF-8[27]是两种
可能的选择 。(ASCII是UTF-8的一个子集 。)
尽管口令的选择不在本文档的范围,已有指导原则发布[17],可供考虑 。
4盐和迭代次数
由于盐和迭代次数是本文档定义的技术的中心,有理由进行一些深入的讨论 。
4.1盐
基于口令的密码技术中的盐传统上用于产生对应于一给定口令的一个大集合的密钥,依
据该盐值从中随机选取一个密钥 。运用一密钥导出函数选择集合中的一个密钥,即:
DK=KDF(P,S)
其中DK是导出密钥,P是口令,S是盐 。这有两个好处:
1. 预计算和口令字典相对应的所有密钥甚至最相像密钥是困难的 。例如,假如盐
是64位长,对每个口令来说,将有多达2^64个密钥 。在基于口令的操作被执
行并且得知盐后,对手只有搜索口令 。
2. 同一个密钥不可能被选择两次 。再者,假如盐是64位长,依据生日悖论,在
大约2^32个密钥已被产生之前,密钥间“碰撞”的机率并不大 。这解决了对
相同密钥的多个用户之间相互影响的顾虑,可能适用于某些加密和认证技术 。
在基于口令的的加密中,加密消息的一方只需在从一口令导出加密密钥时选择一个
大的、足够随机的盐就能保证获得这些好处 。产生消息鉴别码的一方能以类似的方式得