计算机网络7——网络安全2 鉴别与密钥分配

一、鉴别

1、报文鉴别

在网络的应用中,鉴别(authentication)是网络安全中一个很重要的问题。鉴别和加密是不相同的概念。鉴别的内容有二。

  1. 一是要鉴别发信者,即验证通信的对方的确是自己所要通信的对象,而不是其他的冒充者。这就是实体鉴别。实体可以是发信的人,也可以是一个进程(客户或服务器)。因此这也常称为端点鉴别。
  2. 二是要鉴别报文的完整性,即对方所传送的报文没有被他人篡改过。至于报文是否需要加密,则是与“鉴别”性质不同的问题。有的报文需要加密(这要另找措施),但许多报文并不需要加密。

请注意,鉴别与授权(authorization)也是不同的概念。授权涉及的问题是:所进行的过程是否被允许(如是否可以对某文件进行读或写)。

不过有时常用报文鉴别一词包含上述鉴别的两个内容,既鉴别报文的发送者,也鉴别报文的完整性。

下面分别讨论报文鉴别与实体鉴别的特点。

1)用数字签名进行鉴别(原理)

我们知道,书信或文件可根据亲笔签名或印章来鉴别其真实性。但在计算机网络中传送的报文,则可使用数字签名进行鉴别。下面就介绍数字签名的原理。

为了进行数字签名,A 用其私钥 S K A SK_A SKA对报文X进行 D运算(如下图所示)。D 运算本来叫作解密运算。可是,还没有加密怎么就进行解密呢?其实D运算只是把报文变换为某种不可读的密文(因此有时也说成A用其私钥对报文加密,但这样说不准确)。在下图中我们使用“D 运算”而不是“解密运算”,就是为了避免产生这种误解。A 把经过 D运算得到的密文传送给B。B为了核实签名,用A的公钥进行E运算,还原出明文X。请注意,任何人用A的公钥 P K A PK_A PKA,进行E运算后都可以得出 A发送的明文。可见下图所示的通信方式并非为了保密,而是为了进行签名和核实签名,即确认此明文的确是A发送的。
在这里插入图片描述
下面讨论一下为什么数字签名具有鉴别报文的功能。

因为除A外没有别人持有A的私钥 S K A SK_A SKA,所以除A外没有别人能产生密文 D S K A ( X ) D_{SK_A}(X) DSKA(X)这样,B确信报文X是A签名发送的。这就鉴别了报文的发送者。同理,其他人如果篡改过报文,但由于无法得到A的私钥 S K A SK_A SKA,对篡改后的报文进行D运算,那么B对收到的报文进行核实签名的E运算后,将会得出不可读的明文,因而不会被欺骗。这样就保证了报文的完整性。

数字签名还有另一功能,就是发送者事后不能抵赖对报文的签名。这叫作不可否认。若A要抵赖曾发送报文给B,B可把X及 D S K A ( X ) D_{SK_A}(X) DSKA(X)出示给进行公证的第三者。第三者很容易用 P K A PK_A PKA去证实A确实发送X给B。

以上这三项功能的关键都在于没有其他人能够持有A的私钥 S K A SK_A SKA
在这里插入图片描述
如图所示的可保证机密性的数字签名方法,虽然在理论上是正确的,但很难用于现实生活中。因此这一节的小标题后边有“原理”二字。这是因为要对报文(可能很长的报文)先后要进行两次D运算和两次E运算,这种运算量太大,要花费非常多的计算机CPU时间,在很多情况下是无法令人接受的。因此目前对网络上传送的大量报文,普遍都使用开销小得多的对称密钥加密。要实现数字签名当然必须使用公钥密码,但一定要设法减小公钥密码算法的开销。这就要使用后面几个小节所讨论的密码散列函数和报文鉴别码。

2)密码散列函数

列函数(又称为杂凑函数,或哈希函数)在计算机领域中使用得很广泛。密码学对散列函数有非常高的要求,因此符合密码学要求的散列函数又常称为密码散列函数(cryptographic hash function)。以后在不致产生错误概念时,我们也常把密码散列函数简称为散列函数。具体说来,密码散列函数H(M)应具有以下四个特点:

  1. 虽然散列函数的输入报文X的长度不受限制,但计算出的结果 H(X)的长度则应是较短的和固定的。散列函数的输出 H(X)又称为散列值,或散列。散列函数采用确定算法,因此相同的输入必定得出相同的输出。虽然密码散列函数相当复杂,但利用计算机,散列函数的运算还是相当快的。
  2. 散列函数的输入和输出的关系是多对一的。若散列值H(X)的长度为128位,那么输出散列值只有 2 128 2^{128} 2128个有限多的可能值(2!28与IPv6的地址数一样大,是个很大的数值)然而我们的输入报文X却有无限多的取值。可见必然会出现不同输入却产生相同输出的碰撞现象。精心挑选的密码散列函数应当非常不易发生碰撞,即应具有很好的抗碰撞性。
  3. 若给出散列值H(X),则无人能找出输入报文X。也就是说,散列函数是一种单向函数(one-way function),即逆向变换是不可能的。
    在这里插入图片描述
    上述特点的另一种表述方法是
    在这里插入图片描述
    但下面我们要讲到,关于这方面的研究,后来已有了一些新的进展。
  4. 好的密码散列函数还具有这样一些特性:散列函数输出的每一个比特,都与输入的每一个比特有关;哪怕仅改动输入的一个比特,输出也会相差极大;散列函数的运算包括许多非线性运算。

通过许多学者的不断努力,已经设计出一些实用的密码散列函数(或称为散列算法)其中最出名的就是 MD5和SHA-1。MD就是 Message Digest 的缩写,意思是报文摘要MD5 是报文摘要的第5个版本。

报文摘要算法MD5公布于RFC1321(1991年),并获得了非常广泛的应用。MD5的设计者 Rivest 曾提出一个猜想,即根据给定的 MD5报文摘要代码,要找出一个与原来报文有相同报文摘要的另一报文,其难度在计算上几乎是不可能的。但在2004年,中国学者王小云"发表了轰动世界的密码学论文,证明可以用系统的方法找出一对报文,这对报文具有相同的 MD5 报文摘要[W-WANG],而这仅需15分钟,或不到1小时。于是,MD5 的安全性就产生了动摇。随后,又有许多学者开发了对MD5实际的攻击。于是MD5最终被另一种叫作安全散列算法SHA(Secure Hash Algorithm)的标准所取代。

下面仍以MD5为例来介绍报文摘要。这主要是考虑到目前新的散列函数(如SHA-2)是从 MD5 发展而来的。对于有兴趣研究散列函数的读者,MD5是个很好的出发点。

MD5 算法的大致过程如下:
在这里插入图片描述
这样得出的 MD5 报文摘要代码中的每一位都与原来报文中的每一位有关。由此可见,像 MD5这样的密码散列函数实际上已是个相当复杂的算法,而不是简单的函数了。

SHA-1是由美国标准与技术协会NIST提出的一个散列算法系列。SHA-1和MD5相似,但其散列值的长度为160位(比MD5的128位多了25%)。SHA-1也是先把输入报文划分为许多512位长的数据块,然后经过复杂运算后得出散列值。SHA-1比MD5更安全,但计算起来却比 MD5 要慢些。1995年发布的新版本SHA-1[RFC3174]在安全性方面有了很大的改进。

但SHA-1后来也被证明其实际安全性并未达到设计要求,并且也曾被王小云教授的研究团队攻破。谷歌也宣布了攻破SHA-1的消息。现在SHA-1已被另外的两个版本 SHA-2RFC6234]和SHA-3[W-SHA3]所替代。SHA-2和SHA-3都各有好几种变型。前者有 SHA224,SHA-256,SHA-384和SHA-512,后者有SHA3-224,SHA3-256,SHA3-384和SHA3-512在上面名称最后的3位数字表示散列的位数。这里需要指出,SHA-3采用了与SHA-2完全不同的散列函数。现在许多组织都已纷纷宣布停用SHA-1。例如,微软于2017年1月1日起停止支持 SHA-1证书,而以前签发的SHA-1证书也必须更换为SHA-2证书。

请注意,MD5或 SHA-1“被攻破”,是指有人能设法找出具有相同散列值的一对报文。这样就动摇了 MD5或 SHA-1的安全性。但是,密码学家目前尚无法把一个任意已知的报文X,篡改为具有同样 MD5或SHA-1散列值的另一报文Y。

3)用报文鉴别码实现报文鉴别

下面进一步讨论怎样使用散列函数来实现报文鉴别。

下面给出的三个简单步骤,给出鉴别报文的初步概念。

  1. 用户A首先根据自己的明文X计算出散列 H(X)(例如,使用 MDS)。为简单起见我们把得出的散列 H(X)记为 H。
  2. 用户A把散列H拼接在明文X的后面,生成了扩展的报文(X,H),然后发送给 B。
  3. 用户B收到了这个扩展的报文(X,H)。因为散列的长度 H是早已知道的固定值,因此很容易把收到的散列和明文X分离开。B通过散列函数的运算,计算出所收到的明文X的散列H(X)。若 H(X)=H,则 B就认为所收到的明文是 A发送过来的。

但上述做法实际上是不可行的。设想某个入侵者创建了一个伪造的报文M,然后也用同样的方法计算出其散列 H(M),并且冒充 A把拼接有散列的扩展报文发送给B。B收到扩展的报文(M,H(M))后,按照上面步骤3的方法进行验证,发现一切都是正常的,就会误认为所收到的伪造报文就是 A发送的。

因此,必须设法对上述的攻击进行防范。解决的办法可以是:A把双方共享的密钥K(K就是一串不太长的字符串)拼接到报文X后,进行散列运算(如下图所示)。散列运算得出的结果为固定长度的H(X+K),称为报文鉴别码MAC(Message AuthenticationCode)。请注意:局域网中使用的媒体接入控制MAC正好也使用这三个字母,因此在看到缩写词 MAC 时应注意上下文。A 把报文鉴别码 MAC 拼接在报文 X后面,得到扩展的报文,发送给B。我们注意到,共享密钥K并没有出现在网上传送的扩展的报文中。

B收到扩展的报文后,把报文鉴别码 MAC与报文X进行分离。B再用同样的密钥K与报文X拼接,进行散列运算,把得出的结果H(X+K)与分离出的报文鉴别码MAC进行比较如相等,就可确认收到的报文X的确是A发送的。只要入侵者不掌握密钥K,就无法伪造A 的报文鉴别码 MAC,因而无法伪造 A发送的报文。像这样的报文鉴别码称为数字签名或数字指纹。下图所示的过程就是A对报文进行了签名,而B对报文进行了鉴别。
在这里插入图片描述
上图所示的鉴别过程并没有执行加密算法,只是在计算散列值时在报文后面拼接了密钥,因此这种鉴别报文的方法消耗的计算资源很少,但却能有效地保护报文的完整性。

在许多有关鉴别的文献中,常常看到在 MAC 前面加上一个H的写法,即 HMAC (HashedMAC)。MAC与HMAC的区别如图7-8所示[PETE12,第646页]。前面上图所示的 MAC实际上就是HMAC。计算HMAC是规定把密钥K拼接在明文后面,然后使用密码散列算法对其进行运算,得出的散列值就是HMAC。但在计算MAC时则不一定这样做。首先,密钥K不一定非要拼接在明文的后面,只要把密钥K作为一个计算 MAC的参数即可。其次,可以有多种计算 MAC的算法,不一定非要使用严格的密码散列算法。在RFC2104中,对各种不同情况下HMAC的计算方法都有着详细的规定。但在本书中,为了方便,对MAC和 HMAC 可视为同义词。
在这里插入图片描述
上述这种鉴别报文的方法还有一些问题有待解决。例如,采用怎样安全有效的方法来分发通信双方共享的密钥K?另一种可行的方法是采用公钥系统。我们用下图来说明。
在这里插入图片描述
用户A对报文X进行散列运算,得出固定长度的散列H()。用自己的私钥对 H(X)进行D运算(也可以说成是用私钥进行加密),得出已签名的但非固定长度的报文鉴别码 MAC。请注意,这里没有对报文X进行加密,而是对很短的散列 H(X)进行D运算,因此这种运算仍然是很快的。A 把已签名的非固定长度的报文鉴别码MAC,拼接在报文X后面,构成扩展的报文发送给 B。

B收到扩展的报文后,先进行报文分离。虽然B不知道已签名的报文鉴别码的长度,但由于报文X是明文,其结束处可以设有标记,因此分离出MAC不困难。分离后,B对报文X进行散列函数运算,同时用A的公钥对分离出的已签名的报文鉴别码MAC进行E运算(也可以说成是用公钥进行解密)。最后对这两个运算结果H()进行比较。如相等,就说明一切正确。由于入侵者没有A的私钥,因此不可能伪造出A发出的报文。这里我们假定B事先知道A的公钥。

不难看出,采用这种方法得到的扩展的报文,不仅是不可伪造的,也是不可否认的。上图所示的过程,可简称为:“A用自己的私钥进行签名,B用A的公钥进行鉴别”。

2、实体鉴别

实体鉴别和报文鉴别不同。报文鉴别是对每一个收到的报文都要鉴别报文的发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次。

最简单的实体鉴别过程如下图所示。A向远端的B发送带有自己身份A(例如,A的姓名)和口令的报文,并且使用双方约定好的共享对称密钥KB进行加密。B收到此报文后,用共享对称密钥K进行解密,从而鉴别了实体A的身份。
在这里插入图片描述
然而这种简单的鉴别方法具有明显的漏洞。例如,入侵者C可以从网络上截获A发给B的报文,C并不需要破译这个报文(因为破译可能很费时间),而是直接把这个由A加密的报文发送给B,使B误认为C就是A:然后B就向伪装成A的C发送许多本来应当发给A的报文。这就叫作重放攻击(replay attack)。℃甚至还可以截获 A的IP 地址,然后把 A的IP地址冒充为自己的IP地址(这叫作卫欺骗),使B更加容易受骗。

为了对付重放攻击,可以使用不重数(nonce)。不重数就是一个不重复使用的大随机数即“一次一数”。在鉴别过程中不重数可以使B能够把重复的鉴别请求和新的鉴别请求区分开。下图给出了这个过程。
在这里插入图片描述
在上图中,A首先用明文发送其身份A和一个不重数R给B。接着,B响应A的查问,用共享的密钥KB对R加密后发回给A,同时也给出了自己的不重数R。最后,A再响应B的查问,用共享的密钥K对Re加密后发回给B。这里很重要的一点是A和B对不同的会话必须使用不同的不重数集。由于不重数不能重复使用,所以C在进行重放攻击时无法重复使用所截获的不重数。

在使用公钥密码体制时,可以对不重数进行签名鉴别。例如在上图中,B用其私钥对不重数R 进行签名后发回给A。A用B的公钥核实签名,如能得出自己原来发送的不重数 R,就核实了和自己通信的对方的确是 B。同样,A也用自己的私钥对不重数R。进行签名后发送给B。B用A的公钥核实签名,鉴别了A的身份。

公钥密码体制虽然不必在互相通信的用户之间秘密地分配共享密钥,但仍有受到攻击的可能。让我们看下面的例子。

  • C冒充是A,发送报文给B,说:“我是A”。
  • B选择一个不重数R,发送给A,但被C截获了:
  • C用自己的私钥 S K c SK_c SKc冒充是A的私钥,对加密,并发送给B。
  • B向A发送报文,要求对方把解密用的公钥发送过来,但这报文也被C截获了。
  • C把自己的公钥 P K c PK_c PKc冒充是A的公钥发送给B。
  • B用收到的公钥 P K c PK_c PKc对收到的加密的R进行解密,其结果当然正确。于是B相信通信的对方是 A,接着就向A发送许多敏感数据,但都被C截获了。

然而上述这种欺骗手段不够高明,因为B只要打电话询问一下A就能戳穿骗局,因为A 根本没有和 B进行通信。但下面的“中间人攻击”(man-in-the-middle attack)就更加具有欺骗性。下图是“中间人攻击”的示意图。
在这里插入图片描述
从上图可看出,A 想和 B通信,向 B发送“我是 A”的报文,并给出了自己的身份。这个报文被“中间人”C截获,C 把这个报文原封不动地转发给B。B 选择一个不重数 R发送给 A,但同样被℃截获后也照样转发给A。

中间人C用自己的私钥 S K c SK_c SKc对Re加密后发回给B,使B误以为是A发来的。A 收到 R B R_B RB后也用自己的私钥 S K A SK_A SKA R B R_B RB加密后发回给 B,但中途被℃截获并丢弃。B 向 A 索取其公钥,这个报文被C截获后转发给A。

C把自己的公钥 P K c PK_c PKc冒充是A的公钥发送给B,而C也截获到A发送给B的公钥 P K A PK_A PKA

B用收到的公钥 P K c PK_c PKc(以为是A的)对数据DATA加密,并发送给A。C截获后用自己的私钥 S K c SK_c SKc解密,复制一份留下,然后再用A的公钥 P K A PK_A PKA对数据 DATA 加密后发送给 A,A 收到数据后,用自己的私钥 S K A SK_A SKA,解密,以为和 B进行了保密通信。其实,B发送给A的加密数据已被中间人C截获并解密了一份,但A和B却都不知道。

由此可见,公钥的分配以及认证公钥的真实性也是一个非常重要的问题。关于这点我们在后面(7.4.2节)还要讨论。

二、密钥分配

由于密码算法是公开的,网络的安全性就完全基于密钥的安全保护上。因此在密码学中出现了一个重要的分支–密钥管理。密钥管理包括:密钥的产生、分配、注入、验证和使用。本节只讨论密钥的分配。

密钥分配(或密钥分发)是密钥管理中最大的问题。密钥必须通过最安全的通路进行分配。例如,可以派非常可靠的信使携带密钥分配给互相通信的各用户。这种方法称为网外分配方式。但随着用户的增多和网络流量的增大,密钥更换频繁(密钥必须定期更换才能做到可靠),派信使的办法已不再适用,而应采用网内分配方式,即对密钥自动分配。

1、对称密钥的分配

第一,如果n个人中的每一个需要和其他n-1个人通信,就需要n(n-1)个密钥。但每两人共享一个密钥,因此密钥数是n(n-1)/2。这常称为 n 2 n^2 n2问题。如果n是个很大的数,所需要的密钥数量就非常大。

第二,通信的双方怎样才能安全地得到共享的密钥呢?正是因为网络不安全,所以才
需要使用加密技术。但密钥又需要怎样传送呢?

目前常用的密钥分配方式是设立密钥分配中心KDC(KeyDistribution Center)。KDC是大家都信任的机构,其任务就是给需要进行秘密通信的用户临时分配一个会话密钥(仅使用一次)。在下图中假定用户A和B都是KDC的登记用户。A和B在KDC登记时就已经在 KDC 的服务器上安装了各自和 KDC 进行通信的主密钥(master key)KA 和KB。为简单起见,下面在叙述时把“主密钥”简称为“密钥”。密钥分配分为三个步骤(如下图中带箭头直线上的1,2和3所示)
在这里插入图片描述

  1. 用户A向密钥分配中心KDC发送时用明文,说明想和用户B通信。在明文中给出A 和 B 在 KDC 登记的身份。
  2. KDC用随机数产生“一次一密”的会话密钥KAB供A和B的这次会话使用,然后向A发送回答报文。这个回答报文用A的密钥KA加密。这个报文中包含这次会话使用的密钥KAB和请 A转给 B的一个票据(ticket),该票据包括A和B在KDC 登记的身份,以及这次会话将要使用的密钥KB。票据用B的密钥KB加密,A无法知道此票据的内容,因为A没有B的密钥KB,当然A也不需要知道此票据的内容。
  3. 当 B收到 A 转来的票据并使用自己的密钥KB解密后,就知道A要和他通信,同时也知道 KDC 为这次和 A 通信所分配的会话密钥 KAB。

此后,A和B就可使用会话密钥KB进行这次通信了。

请注意,在网络上传送密钥时,都是经过加密的。解密用的密钥都不在网上传送。

KDC 还可在报文中加入时间戳,以防止报文的截取者利用以前已记录下的报文进行重放攻击。会话密钥 KAB是一次性的,因此机密性较高。而KDC 分配给用户的密钥KA和KB都应定期更换,以减少攻击者破译密钥的机会。

目前最出名的对称密钥分配协议是Kerberos V5?[RFC 4120,4121,建议标准],是美国麻省理工学院(MIT)开发的。Kerberos既是鉴别协议,同时也是KDC,它已经变得很普及。Kerberos 使用比 DES 更加安全的高级加密标准 AES 进行加密。下面用下图介绍 KerberosV4 的大致工作过程(其原理和 V5 大体一样,但稍简单些)。
在这里插入图片描述
Kerberos 使用两个服务器:鉴别服务器 AS(Authentication Server)、票据授予服务器 TGS(Ticket-Granting Server)。Kerberos 只用于客户与服务器之间的鉴别,而不用于人对人的鉴别。在上图中,A是请求服务的客户,而B是被请求的服务器。A通过Kerberos向B请求服务。Kerberos需要通过以下六个步骤鉴别的确是A(而不是其他人冒充A)向B请求服务
后,才向A和B分配会话使用的密钥。下面简单解释各步骤。

  1. A用明文(包括登记的身份)向鉴别服务器AS表明自己的身份。AS就是KDC,它掌握各实体登记的身份和相应的口令。AS对A的身份进行验证。只有验证结果正确,才允许 A和票据授予服务器 TGS 进行联系。
  2. 鉴别服务器AS向A发送用A的对称密钥KA 加密的报文,这个报文包含A和 TGS通信的会话密钥 KS以及 AS 要发送给 TGS的票据(这个票据是用 TGS 的对称密钥 KTG加密的)。A 并不保存密钥KA,但当这个报文到达 A 时,A 就键入其口令。若口令正确,则该口令和适当的算法一起就能生成密钥KA。这个口令随即被销毁。密钥KA 用来对 AS 发送过来的报文进行解密。这样就提取出会话密钥KS(这是A和TGS通信要使用的)以及要转发给 TGS的票据(这是用密钥KTG加密的)。
  3. A 向 TGS 发送三项内容:
  • 转发鉴别服务器 AS 发来的票据。
  • 服务器B的名字。这表明A请求B的服务。请注意,现在A向TGS证明自己的身份并非通过键入口令(因为入侵者能够从网上截获明文口令),而是通过转发AS发出的票据(只有A才能提取出)。票据是加密的,入侵者伪造不了。
  • 用Ks加密的时间戳T。它用来防止入侵者的重放攻击。
  1. TGS发送两个票据,每一个都包含A和B通信的会话密钥KAB。给A的票据用KS加密;给B的票据用B的密钥KB加密。请注意,现在入侵者不能提取KAB,因为不知道KS和 KB。入侵者也不能重放步骤3,因为入侵者不能把时间戳更换为一个新的(因为不知道KS)。如果入侵者在时间戳到期之前,非常迅速地发送步骤3的报文,那么对 TGS 发送过来的两个票据仍然不能解密。
  2. A 向 B转发 TGS 发来的票据,同时发送用KAB加密的时间戳T。
  3. B把时间戳T加1来证实收到了票据。B向A发送的报文用密钥KAB加密

以后,A和B就使用 TGS给出的会话密钥KB进行通信。

顺便指出,Kerberos要求所有使用Kerberos的主机必须在时钟上进行“松散的”同步。所谓“松散的”同步是要求所有主机的时钟误差不能太大,例如,不能超过5分钟的数量级这个要求是为了防止重放攻击。TGS 发出的票据都设置较短的有效期。超过有效期的票据就作废了。因此入侵者即使截获了某个票据,也不能长期保留用来进行以后的重放攻击。

2、公钥的分配

在公钥密码体制中,公钥的分配方法并不简单。本节就讨论这个问题。

我们不妨先假定大家都各自保存有自己的私钥,而把各自的公钥发布在网上。假定A和B都是公司。有个捣乱者给A发送邮件,声称自己是B,要购买A生产的设备,货到付款,并给出了B的收货地址。邮件中还附上“B的公钥”(其实是捣乱者的公钥)。最后用捣乱者的私钥对邮件进行了签名。A收到邮件后,就用邮件中给出的捣乱者的公钥(A以为自己使用了B的公钥),对邮件中的签名进行了鉴别,就误认为B真的是要购买设备。当A把生产的设备运到B的地址后,B才知道被愚弄了!捣乱者甚至还可伪造一个冒充B的网站,上面有“B的公钥”(其实是捣乱者的公钥)。

那么,有没有可靠的方法来获得B的公钥,并且能确信公钥是真的?

有一种非常可靠的方法,就是公司A派人亲自去公司B,直接向公司B要其公钥这样拿到的B的公钥当然是可信任的。但这种很不方便的办法显然不能普遍推广使用。

现在流行的办法,这就是找一个可信任的第三方机构(第三方机构既不是需要B的公钥的公司A,也不是拥有公钥的公司B),给拥有公钥的实体发一个具有数字签名的数字证书(digital certificate),有时也可简称为证书。数字证书就是对公钥与其对应的实体(人或机器)进行绑定(binding)一个证明。因此它常称为公钥证书。这种签发证书的机构就叫作认证中心 CA(Certifcation Authority),它由政府或知名公司出资建立(这样就可以得到大家的信任)。每个证书中写有公钥及其拥有者的标识信息(人名、地址、电子邮件地址或IP地址等)。更重要的是,证书中有CA使用自己私钥的数字签名,这就是认证中心CA把B的未签名的证书进行散列函数运算,再用CA的私钥对散列值进行D运算(也就是对散列值进行签名)。这样就得到了CA的数字签名。把CA的数字签名和未签名的B的证书放在一起就最后构成了已签名的B的数字证书(如下图所示)。图中的数字证书只给出了最重要的几个项目。这样的证书无法伪造。任何用户都可从可信任的地方(如代表政府的报纸)获得认证中心CA的公钥,以验证证书的真伪。这种数字证书是公开的,不需要加密。现在我国的认证中心已有不少,例如,在金融领域,中国金融认证中心CFCA(ChinaFinanciaCertification Authority)是由中国人民银行牵头,联合 14 家全国性商业银行共同建立的金融认证机构,其权威性是毋庸置疑的。在国际上,威瑞信公司VeriSign是发行数字证书产品的-家具有权威性的公司。
在这里插入图片描述

公司A拿到B的数字证书后,可以对B的数字证书的真实性进行核实。A使用数字证书上给出的 CA的公钥,对数字证书中CA的数字签名进行E运算,得出一个数值。再对B的数字证书(把CA的数字签名除外的部分)进行散列运算,又得出一个数值。比较这两个数值。若一致,则数字证书是真的。当A收到包含有B的数字签名的订货单时,也能用类似的方法,对订单的真实性进行核实(使用B的数字证书中给出的B的公钥)。

为了使CA发布的数字证书在各行各业中能够通用,数字证书的格式就必须标准化。为此,ITU-T制定了X.509 协议标准,后来IETF 采用了现在的版本,即X.509 V3 TRFC 5280]作为互联网的建议标准(147页)。X.509又称为互联网公钥基础结PKI(PublicKeyInfrastructure)。

X.509规定了一个数字证书必须包括以下这些重要字段:

  • X.509的版本
  • 数字证书名称及序列号
  • 本数字证书所使用的签名算法
  • 数字证书签发者的唯一标识符
  • 数字证书的有效期(有效期开始到结束的日期范围)
  • 主体名(或主题名,公钥和数字证书拥有者的唯一标识符)
  • 公钥(数字证书拥有者的公钥和使用算法的标识符,对应的私钥由证书拥有者保存)

X.509提出把多级认证中心链接起来的,构成一个树状的认证系统(如图(a)所示)。在多级认证系统的末端就是用户(A~E)。在X.509中并没有规定这种链接需要多少级,也没有给每一级的认证中心规定统一的名称。但最高一级的认证中心都称为根认证中心(RootCA),即公认可信的认证中心(或无条件信任的),且其公钥是公开的。在这种树状的认证系统中,可以有不止一个根CA。从根 CA 向下的所有链接都称为信任链,表示处在这条链接上的认证机构都是可信的。
在这里插入图片描述
在这里插入图片描述
若证书链中的某个认证中心没有严格遵守证书所规定的要求(例如,把证书转让给了其他单位,但并未严格验证其身份),那么这个节点以下的证书是否还可信,就应重新验证用户若发现私钥被盗或遗失,应及时报告上级CA,以便撤销证书。每一个CA应当有一个公布于众的、用本 CA 的私钥签名证书撤销名单,并定期更新。

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值