目录
引言
我们在上篇内容中学习了如何使用密码术为两个通信实体提供机密性。但通信时的机密性并不是我们所关注的全部,我们还应注重报文完整性(message integrity)这个同等重要的主题。
5.3 报文完整性和数字签名
报文完整性又被称为报文鉴别,数字签名是它的相关主题。那么什么是报文完整性呢?我们再次使用Alice和Bob来定义这个问题。假定Bob接收到一个报文(密文报文或明文报文),并且他认为这个报文是由Alice 发送的。为了鉴别这个报文,Bob需要证实两个问题:
- 该报文的确源自Alice。
- 该报文在到Bob的途中没有被篡改。
具体我们该如何帮助Bob实现鉴别呢,首先要学习一下前备知识,密码散列函数。
5.3.1密码散列函数
如上图所示,散列函数以m为输入,并计算得到一个称为散列的固定长度的字符串。密码散列函数(cryptographic hash function)要求具有下列附加的性质:
找到任意两个不同的报文x和y使得,在计算上是不可能的。
不严格地说,这种性质就意味着入侵者在计算上不可能用其他报文替换由散列函数保护的报文。具体说来就是,如果是报文和由发送方生成的报文散列的话,则入侵者不可能伪造另一个报文y的内容,使得该报文具有与原报文相同的散列值。
我们来举一个例子,将每个字符看作一个字节,并把这些字节加到一起,一次用4字节的块来进行计算。假定Bob欠Alice钱并且向Alice发送一张借据,这个借据包含以下文本字符串“IOU100.99BOB"。这些字符的ASCII表示为49,4F,55,31,30,30,2E,39,39,42,4F,42。
我们使用简单的检验和来代替散列函数,然后发现,正确的报文(上面)和错误的报文(下面)具有相同的检验和,但转化成明文,Bob要多付Alice很多钱。所以我们要使用强有力的散列函数。目前使用广泛的散列函数有两个,第一个是Ron Rivest [RFC 1321] 的MD5散列算法。第二个是安全散列算法SHA-1(Security Hash Algorithm)[ FIPS 1995]。
5.3.2 报文鉴别码
理解了散列函数之后,我们学习一下如何执行报文完整性:
Alice生成报文m并计算散列(例如使用SHA-1)。
Alice 则将附加到报文m上,生成扩展报文,并将该扩展报文发给Bob。
Bob接收到一个扩展报文并计算。如果,则一切正常。
这种方法存在明显缺陷,入侵者能够生成虚假报文,在其中声称她就是Alice,计算并发送给Bob。当Bob接收到该报文同样能够通过上面的检验。
所以除了使用密码散列函数,Alice和Bob将需要共享密钥s。这个共享的密钥只不过是一个比特串,它被称为鉴别密钥(authentication key)。使用这个共享密钥,报文完整性能够执行如下:
Alice生成报文m,用鉴别密钥级联m以生成,并计算散列。被称为报文鉴别码( Message Authentication Code, MAC)。Alice则将MAC附加到报文m上,生成扩展报文,并将该扩展报文发送给Bob。Bob接收到一个扩展报文,由于知道,计算出报文鉴别码。如果,则一切正常。
MAC的一个优良特点是它不要求一种加密算法。使用一个MAC,实体能够鉴别它们相互发送的报文,而不必在完整性过程中综合进复杂的加密过程。
目前最为流行的MAC标准是HMAC,它能够与MD5或SHA-1一道使用。HMAC实际上通过散列函数运行数据和鉴别密钥两次 [Kaufman 1995; RFC 2104]。HMAC:,ipad 和 opad是用于填充的固定内容。对于向通信实体分发这个共享的鉴别密钥的问题,我们可以使用上篇文章学习的公钥加密技术。
5.3.3 数字签名
在数字领域,人们通常需要指出一个文件的所有者或创作者,或者表明某人认可一个文件内容。数字签名(digital signature)就是在数字领域实现这些目标的一种密码技术。
数字签名应当以可鉴别的、不可伪造的方式进行。这就是说,该签名必须是可证实的,且该签名无法伪造。为了实现这一点,Bob考虑附加一个MAC用作签名,其中MAC是由他的密钥(对他是独特的)作用到该报文上而生成的,然后得到该散列值。而Alice为了验证该签名,她必须也具有该密钥的副本,但这是不合规的。因此MAC无法胜任这项工作。再考虑一个方案,上篇内容讲过使用公钥密码,Bob拥有公钥和私钥,这两种密钥对Bob均为独特的。因此,公钥密钥是一种提供数字签名的优秀候选者。下面,我们具体描述一下这个步骤。
假设Bob要以数字方式签署一个文档m。我们能够想象这个文档是Bob打算签署并发送的一个文件或一个报文。如下图所示:
为了签署这个文档,Bob直接使用他的私钥计算。回忆一下我们上篇内容学习的,一般都是使用公钥加密明文私钥解密,乍一看,会奇怪Bob这里怎么用他的私钥签署文档!但加密和解密都只不过是数学运算而已,并且Bob的目的不是弄乱或掩盖文档的内容,而只是要以可鉴别的、不可伪造的方式签署这个文档。Bob对文档m签名之后所得的文档就是。然后Alice拿到了m和,她现在要证明Bob确实签署过这个文档。Alice持有Bob的公钥,并把它用于Bob的数字签名上,从而得到了文档m,即计算。
数字签名是否满足了可鉴别和不可伪造这两个要求?我们可以基于以下证明:
无论是谁签署这个报文,都必定在计算签名过程中使用了这个私钥,。而知道这个私钥的唯一一人只有Bob。
同时,如果源文档m被修改过,比如改成了另一个文档,则Bob对m生成的签名对无效,因为不等于。因此我们看到数字签名不光验证了该报文的源,也提供完整性检测,使得接收方验证该报文未被篡改。
对用加密进行数据签名的担心是,加密和解密的计算代价昂贵。给定加解密的开销,通过完全加密解密对数据签名是杀鸡用牛刀。更有效的方法是将散列函数引入数字签名。使用散列函数,Bob 对报文的散列签名而不是对报文本身签名,即Bob计算。因为通常比报文m小得多,所以生成数字签名所需要的计算耗费大为降低。如下图所示:
然后是Alice在接收到Bob的明文形式的初始报文和数字签名后,如何鉴别报文完整性:
我们现在比较一下数字签名技术和前面提到的MAC。数字签名和MAC都以一个报文(或文档)开始。
为了从该报文中生成一个MAC,我们为该报文附加一个鉴别密钥,然后取得该结果的散列。注意到在生成MAC过程中既不涉及公开密钥加密,也不涉及对称密钥加密。
为了生成一个数字签名,我们首先取得该报文的散列,然后用我们的私钥加密该报文(使用公钥密码)。因此,数字签名是一种“技术含量更高的”技术,因为它需要一个如后面描述的、具有认证中心支撑的公钥基础设施(PKI)。
5.3.3.1 公钥认证
数字签名的一个重要应用是公钥认证(public key certification,PKI),即证实一个公钥属于某个特定的实体。公钥认证被用于许多流行的安全网络协议中,包括IPsec 和SSL。
为了深入理解这个问题,我们考虑经典的“披萨恶作剧”。假定Alice正在从事披萨派送业务,从因特网上接受订单。Bob是一个爱吃披萨的人,他向Alice发送了一份包含其家庭地址和他希望的比萨类型的明文报文。Bob在这个报文中也包含一个数字签名(即对原始明文报文的签名的散列),以向Alice证实他是该报文的真正来源。为了验证这个数字签名,Alice获得了Bob的公钥并核对该数字签名。通过这种方式,Alice确信是Bob而不是某些青少年恶作剧者下的披萨订单。
如上图所示,Trudy进行了一场恶作剧,他向Alice发送一个报文,在这个报文中他说他是Bob,给出了Bob家的地址并订购了一个披萨。在这个报文中,他也包括了他(Trudy)自己的公钥,虽然
Alice自然地假定它就是Bob的公钥。Trudy也附加了一个签名,但是这是用他自己的私钥生成的。在收到该报文后,Alice就会用Trudy的公钥(Alice认为它是Bob的公钥)来解密该数字签名,并得到结论:这个明文报文确实是由Bob生成的。而当外送人员带着披萨到达Bob家时,他会感到非常惊讶!
上面例子告诉我们,要使公钥密码有用,需要能够证实你具有的公钥实际上就是与你要进行通信的实体的公钥。将公钥与特定实体绑定通常是由认证中心(Cerification Authority,CA)完成的,CA 的职责就是使识别和发行证书合法化。CA具有下列作用:
CA证实一个实体的真实身份。如何进行认证并没有强制的过程。当与一个CA打交道时,一方必须信任这个CA能够执行适当的严格身份验证。你对与公钥相联系的身份的信任程度,和你对CA及其身份验证技术的信任程度,是一个层面的问题。
一旦CA验证了某个实体的身份,这个CA会生成一个把其身份和实体的公钥绑定起来的证书(cerificate)。这个证书包含这个公钥和公钥所有者全局唯一的身份标识信息。由CA对这个证书进行数字签名。
通过这种方式,当Bob下订单的同时,他也发送了其CA签署的证书。Alice使用CA的公钥来核对Bob证书的合法性并提取Bob的公钥。这就防止了Trudy玩弄“披萨恶作剧”。