密钥的生命周期
密钥管理最基本的目的就是无论何时都要保证所有密钥的安全和完整。对任何一个密钥而言,它的生命周期从生成开始,并一直持续到不再使用且被销毁时为止。密钥生命周期的主要阶段如下图所示。
密钥的生命周期
几乎在所有情形中,每个密钥最终都会被另一个所取代。因此可以说这个过程是一个循环:某个密钥在销毁时,必有一个新密钥来替代它。然而,新密钥也可能在旧密钥被毁之前就已经经历了生成、配送和存储等过程。在某些系统中可能还会有密钥存档的要求。
任何密钥在其生命周期的每个阶段都需要配备监控程序以侦查潜在的密钥攻击者。这几乎肯定会涉及到对密码使用记录的某种审查跟踪。显然,必须对这个过程加以监控,否则这种审查跟踪毫无意义。更进一步说,必须有人有权在密钥受到潜在威胁时作出反应,监控才有价值。特别是在大型密码系统里,往往都要求密钥有一个指定的、对其安全负责的主人。
下面我们来分别讨论这一生命周期中的每一个阶段。虽然很多基本的密钥管理原则都是相同的,但对称密码术的密钥管理与非对称密码术的密钥管理很不一样。事实上,PKI的建立是非对称算法的密钥管理在某些方面的基矗我们的讨论中将主要关注对称系统,但当两个系统的差别很显著的时候,我们也偶尔作些说明。
密钥生成
密钥生成常常是个困难的问题,特别是对公钥算法而言,因为它的密钥有很复杂的数学特性。对于大多数对称算法,任一个二进制数串(或偶尔也用其他符号)都能成为密钥。这意味着大多数对称算法的用户都有能力生成他们自己的密钥。主要的难点在于要找出一种方法,使生成的密钥是不可预测的。大众化的方法有手工技巧(例如抛硬币)、由个人资料派生(如PIN)或者使用(伪)随机数生成器。
对于非对称系统,情形就不同了。大素数的生成过程要求进行复杂的数学运算,可能还需要可观的资源支持。正如我们在前一节指出的,用户可能不得不信任外部生成的密钥或外部编写的软件。我们来看看RSA,它的安全性取决于攻击者能否因子分解模数N。如果密钥生成过程仅能产生有限个数的素数,那么攻击者就能生成那些有限的素数并且用每个素数作为因子去试。这个简单例子说明了公钥系统必须有一个好的密钥生成方法的重要性。
密钥配送与密钥存储
密钥的存储与配送都非常重要。它们所面临的难题和解决的方法往往很相似,所以我们把它们放在一起讨论。
使用强算法的目的是防止攻击者算出密钥。但是如果攻击者能在系统中某个确定的地方找到密钥,上述做法便毫无用处了。安全的密钥存储几乎肯定会使用某些形式的物理保护,例如,密钥可能就存储在某些物理存取受到严密控制的地方。这些密钥是否安全,其关键就在于存取控制的有效性。此外,密钥也可能存在一个设备里,如智能卡,这种卡有两层保护措施。第一层是卡的主人有责任确保这张卡一直在他的掌握之中。第二层是这张卡可能具有高水平的抗窜改性,可以防止他人得到卡之后读出其中的内容。
一条很粗略的密钥保护规则就是,理论上密钥不应出现在系统中任何确定的地方,除非对它们进行适当的物理保护。如果无法实现这种物理保护,那么就应该对此密钥用另一个密钥加密或者将它拆分为两个或更多个组件。这条规则是在绝大多数加密工作还在硬件上进行的时期制定的。如果行得通,它仍然是很有效的,因为具有抗窜改性的硬件存储看来能提供比软件更好的保护。利用另外的密钥来加密密钥的做法导出了密钥层次的概念,其中每个密钥都用来保护位于它下一级的那个密钥。密钥的层次很重要,我们还会在本章的后面对此进行讨论。现在,我们只需注意,若要安排一个系统使得每个密钥都被另一个密钥所保护,显然是不可能做到的,因为必然会有一个处于系统顶端的密钥。这个主密钥可能用组件的形式来生成和配送。这些组件分别由不同的主人所持有并且被分别安装在加密器件中。显然,为了让使用组件的概念是有意义的,应使任何人都无法以确定的形式接触所有的组件。
现在我们来讨论如何构造密钥组件而不泄露密钥的任何信息。假定有两个组件合起来构成一个密钥K,最原始的方法是用K的前一半作为第一个组件K1,另一半作为组件K2。然而,这样的话知道K1就可能找出K,办法是去试所有可能的K2的值。例如,如果K是一个64比特的密钥,知道K1就意味着找出K只需对K2进行232次尝试,这个数目与密钥穷举搜索法所需的264次尝试相比是可以忽略不计的。一个更好的办法是生成两个与K一样大小的组件K1和K2,比如使得K是K1和K2进行XOR运算的结果(K=K1⊕K2)。由于K和K2同样大小,知道组件K1并不会使得找出K的速度加快,因为搜索K2一点也不比搜索K容易。
一种更复杂的办法是使用秘密共享模式的概念。在这种模式中,有若干称为秘密份额的数值,将这些份额中的几个(或全部)组合起来就能得到密钥。譬如,可以用7个秘密份额来设计一个系统,使得其中的任意4个便能独立地定出密钥,但只知道其中任何3个就不能得出该密钥的任何信息。这不仅引进了与共享责任相联系的安全性,而且在需要恢复密钥时,可以较少地依赖特定的个人。
就像密码术的其他许多方面一样,通信系统的密钥管理比数据存储的管理要难很多。如果用户只是要保护他们自己的信息安全,那么就不需要配送密钥。然而,如果需要进行安全的通信,往往就需要进行密钥配送。此外,配送的数量取决于要求安全通信的终端的个数。如果只有两个这样的终端,我们称之为点到点的情形。如果有两个以上的通信终端要连接,那么密钥配送问题的解决方案取决于两个因素,即商业用途与终端环境。这里有两种极端情况。一种是“车轴辐条”式的环境,由一个中心终端(或称车轴)和其他若干终端组成,后者必须能安全地与中心终端进行通信。另一种是“多到多”的环境,此时可能每个终端都要求能够安全地连接到其他任何终端上。
公钥系统的情况有所不同。这里讨论的大部分内容适用于私钥,因为像对称密钥一样,私钥需要保密。但是,公钥是通过证书来存储和配送的,第七章已对此进行过讨论。
密钥确立
密钥确立的概念是:两个参与者能通过一种方法在他们之间商立一个密钥。这种方法叫做密钥确立协议,它是密钥配送的一种替换物。当然关键的一点是,在确立密钥前,两个参与者能够互相认证。利用公钥证书就能做到这一点。在这种类型的协议中,最著名并被广泛使用的当属由迪菲和赫尔曼所设计的那个协议。在迪菲-赫尔曼协议中,两个参与者须交换他们的公钥。然后他们要使用一种精心选取的组合规则,将自己的私钥与对方的公钥组合在一起,得出一个公用的值,再从中生成密钥。
两个用户必须能够彼此认证,这具有极为重要的意义。若做不到这一点,协议就容易遭受所谓“中间人的攻击”。在这种攻击中,攻击者会拦截两方之间的通信,并且在一方面前假扮成另一方。结果是双方都相信他们有了一个彼此商定的密钥,而事实上每一方都只是跟“中间人”商定了密钥。这是数字证书失效的一种情形。
迪菲–赫尔曼的密钥确立协议的基本思想是,即使有人对确立密钥的通信过程进行了窃听,窃听者仍无法计算出密钥。量子密码术是一种有趣的确立密钥的新技术,它不依赖于密码算法的强度。两个参与者可以利用量子力学的性质来传送信息,同时又能监测传送是否被窃听。密钥的确立包括了一个用户发送一个随机序列给另一个用户的过程。如果它被窃听了,那么该窃听活动是可以监测到的,密钥确立过程就会重新开始,然后未被窃听的序列才会用来作为密钥的基矗
密钥的用途
在很多系统中,每个密钥都有指定的用途并且必须专钥专用。我们还不太清楚这个要求是否总是合理的。但是,有确凿的例子说明赋予同一个密钥多种用途的做法存在诸多弱点。现在普遍认为,坚持每个密钥有独立用途是一个很好的习惯。
我们在前文看到的一些例子表明密钥的专钥专用概念是一个好主意。例如,我们已经讨论过为给其他密钥加密而使用的密钥,它与给数据加密的密钥是有区别的。为了理解实践中的这种约束,我们需要再次提到抗窜改安全模块(TRSM)这个概念。当用户收到某个密文,然后把密文与适当的密钥输入TRSM时,用户期望的是TRSM输出数据。但如果用户收到的是一个被加密过的密钥,那么,用户并不希望模块输出确定的密钥。相反,用户希望该模块将密钥破译并在其中使用。但是,密文和密钥都是二进制数串,加密算法无法作出区分。因此,密钥用途的概念必须与TRSM的功能相关而不是与实际算法相关。
中间人
为了使密钥具有唯一的用途,我们需要给每个密钥分配一个标签。这个标签会说明该密钥的用途,例如“数据加密密钥”、“密钥加密密钥”、“MAC生成密钥”或“MAC验证”。当然,这些标签的精确形式取决于TRSM和环境。对非对称算法而言,用户可能需要两组公钥与私钥对。其中的一组用于加密,另一组用于签名。
一旦商定了标签,就必须通过某种方法将标签和密钥绑在一起,从而使对手不能改变标签,进而避免误用密钥。一种方法是使该密钥的所有加密版本都依赖于TRSM的顶层密钥及密钥标签。这可以确保该标签只能在TRSM内部“抹去”。一旦标签被绑到密钥上,就必须有某种机制来保证密钥不会被误用。TRSM的设计和结构对增强这种机制起着决定性的作用。
密钥变更
所有的密码系统都必须有变更密钥的能力。这样做的原因有很多;变更本身可以是按计划的定期更新,也可以是对可疑危害作出的反应。如果怀疑一个密钥已被泄露,也许就要立刻变更该密钥。很多机构会定期进行密钥变更演习操作,为应对紧急情况的出现作好准备,促使他们的职员积累解决相关实际问题的经验。
定期变更密钥可以减少密钥被暴露的几率,并降低它们对于攻击者的价值。一次成功攻击的价值显然决定了攻击者愿意投入的时间和精力。有一种销售点电子转账系统(EFTPOS),它的密钥在每一次交易后都会变更。对这样的系统而言,攻击者不会为了仅得到一个密钥去破坏一次交易而投入大量资源去实施攻击。
对于多长时间必须变更密钥并无一定之规。然而很清楚,每个密钥都应该在使用密钥穷举搜索法把它找出来之前很久就加以变更。另一个要考虑的因素是:需要在密钥可能泄露的风险和变更密钥可能带来的风险之间权衡利害得失。
密钥销毁
对于那些不再需要的密钥,我们必须用安全手段加以销毁。简单地将存有密钥值的文件删除是不够的。极详细地说明实施销毁的细节往往十分必要。例如,ANSI的一个相关标准说:“纸录的密钥资料可用切割、撕碎、烧掉或制成纸浆等方式予以销毁。销毁存储在其他介质中的密钥资料时,必须保证不可能对其用物理或电子手段加以复原。”这段话特别强调了对于所有用电子手段存储的密钥,必须明确地删除,不可留下任何可能对攻击者有用的痕迹或其他消息。这在软件应用中尤为重要,因为用于存储密钥的存储器以后也许会另作他用。
密钥层次
正如我们已经指出的那样,人工操作既费时又昂贵。人们肯定希望将人工操作局限在最小的范围内。对于密钥管理,只要可能,人们更倾向于用电子配送密钥而不是用人工配送。但是,如果用电子配送一个密钥,那么在传输过程中一定要对其加以保护以免暴露。为达到这一目的,人们常用的方法是用另一个密钥给这个密钥加密。正如我们已经提到过的,这就引出了密钥层次的概念,其中处于顶层的主密钥并不能用别的密钥来保护它。因此主密钥需要人工配送,此时的主密钥或是存储于抗窜改设备,或是借助于密钥的组件形式。
最简单的密钥分层形式是分为两层。主密钥是用来加密密钥的密钥,它只用于保护下层的密钥。下层密钥称为会话密钥或工作密钥。它们的作用随应用情形的不同而有所差别。例如,它们可能因机密的需要用于对数据进行加密,或者为保持数据的完整性而用于计算MAC。会话可以用几种方式来定义,例如可以用持续的时间或多种不同的用途来定义。当会话密钥需要变更时,新的替代密钥在主密钥的保护下进行配送。但是,如果主密钥需要变更,则须人工进行。人工的密钥变动常常不太实用,因此很多系统有三个层次,在主密钥和会话密钥之间增加了一层。这一层的密钥是用来加密下层密钥的,作用是保护会话密钥。然而现在,这些用来加密密钥的密钥可以在主密钥的保护下进行配送了。这附加的一层使得用来加密密钥的密钥能够通过电子手段完成变更,并能大大降低人工变更密钥的需要。上述两种情形可用下列图解来说明,其中每个密钥“保护”着它下面的一个密钥。
简单的密钥层次
在讨论密钥管理的过程中,我们至此一直假定工作密钥是对称的。然而用于加密工作密钥的算法并不一定要与用于保护数据的算法相同。需特别注意的是,即使工作密钥是对称的,它也并不妨碍对顶层密钥使用公钥密码术。其实,在很多混合系统中,非对称算法被用来为对称算法配送密钥。