🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
第六章 密钥管理
6.1 密钥的管理与分配
接下来我们来学习密钥的管理与分配。
首先看密钥管理的概述,近代密码体制基于密钥的保密性,一切的秘密寓于密钥,密码体制的安全性就取决于密钥的安全性。攻击者通常有两种手段可以攻击密码体制,一种是通过破译的方法,破译密码算法,另外一种就是窃取密钥,窃取密钥,它的代价或者说它的难度是远低于上面那种破译密码算法。窃取密钥可以通过在目标系统当中置入木马或者后门,来获取密钥,也可以通过社会工程攻击,然后来获取密钥。
我们来看一下基本概念,密钥管理是一种指导密钥生命期当中相关技术问题的安全策略,以抵御各种潜在的威胁。密钥的生命周期包括密钥的产生、存储、分配、使用、更换、撤销和销毁。在密钥的生命周期当中,面临的威胁包括密钥的泄露,密钥的失效,未授权的滥用等等。对称和非对称密码体制,它的密钥管理不太相同。下面分两种密码体制来介绍密钥的管理。
首先来看对称密码体制的密钥管理,对称密码体制它的密钥管理相对比较复杂,加密密钥等于解密密钥,需要同时保护密钥的机密性、完整性和真实性。大型的网络系统所需要的密钥种类多,数量多,密钥的管理尤其困难。美国国家标准学会ANSI颁发了ANSI X9.17金融机构密钥管理标准,这个标准为DES、AES等商业密码的应用,提供了密钥管理的指导。
对称密码体制,它的密钥管理是通过分级的方式来管理的,把这个密钥分成了三个等级,初级密钥、二级密钥和主密钥。
初级密钥是用来加密实际数据的密钥,包括加密文件的初级文件密钥,这样的密钥它的生存周期往往是与被保护的文件是一样长的。当然如果被保护文件它的周期很长的话,也有可能在中途,会进行密钥的更新。另外对通信会话进行保护的初级通信密钥,通常一个密钥使用一次或多次,它的生存周期很短,原则上是一次一密,也就是说一次通信或者说一个通信会话使用一个密钥,下一次会话再使用新的密钥。
二级密钥是用来保护初级密钥的,又叫做密钥加密密钥。也就是说二级密钥是用来构建一个初级密钥交换和分配的安全信道的。
在二级密钥之上还有一层主密钥,就是来对二级密钥进行保护的,它往往具有最高的级别,生存周期是最长的。
6.2.1 分级密钥的产生与存储
密钥的产生有这个手工的或者自动的方式,基本的要求就是具有良好的随机性,不可预测性包括,具有长周期性非线性的或者统计上是等概率的,符合这些要求的密钥往往是比较安全的。这个选择密钥方式不当,会影响这个密钥以及密码算法的安全性,差的选择方式容易受到字典攻击,比如说这个不具备良好的随机性,然后容易被预测的话,那这个时候攻击者就可以怎么样?产生一个密钥的字典,然后大大缩小密钥猜测的这样一种难度。
我们再来看分级密钥的产生,主密钥最高等级通常使用物理噪声源产生真随机序列,作为主密钥,二级密钥的产生可以使用这个随机数发生器,然后产生这个伪随机数序列,或者使用主密钥加上一个强的密码算法,来生成二级密钥。而初级密钥可以把一串随机数把它视为受高级密钥加密后的初级密钥解密得到初级密钥。也就是说初级密钥通常是把一串随机数,然后用高级密钥对它做一个紧密算,得到初级密钥。接下来再来看密钥的存储形态,密钥可以以明文的形态来存储,也可以以密文的形态来存储,还可以以分量的形态来存储。
我们分别看一下分级密钥它的存储。主密钥是最高级的密钥,没有更高级的密钥可以对它进行加密存储,所以主密钥只能是明文存储的,这就要求存储器必须高度安全,物理上安全,逻辑上安全,通常专用一个密码的装置把它装在里面,或者主密钥也可以采用分量的方式来存储,二级密钥的存储就可以使用比它高级的主密钥来加密存储,以密文的形态来存储。初级密钥又可以使用这个二级密钥来加密存储,初级密钥的存储空间往往是工作存储器,这个时候就要确保工作存储器它的安全。刚才提到有分量的方式来存储密钥,这里我们来看一下门限密钥保存方案,它就是一种分量存储方案,又叫做秘密共享或者秘密分享。也就是说将秘密,这里就是密钥分割成若干份,其中的一定的份额组合起来,才能够把这个秘密密钥恢复出来。Shamir建议的方案是将这个密钥按某种方式分为w个子密钥k1k2到kw然后把这 w个子密钥分发给w个人,任意t个子密钥计算或恢复密钥k是容易的。这个 T就是门限,而少于t个子密钥,要计算和恢复密钥k在理论上是不可行的,不可解的。
例如一个密钥可以把它分成5份,任意的3份都可以结合起来,重新产生这个密钥。这里这个三就是门限。说到分量形态的秘密,密钥的存储和管理方案,这里我想到了金庸的小说、鹿鼎记以及相关的影视作品。这个作品当中一条主线就是几方势力都在收集几本《四十二章经》。韦小宝收集齐了全部的《四十二章经》之后,偶然的机会通过焚烧,发现了每一本《四十二章经》里面都有一份地图的碎片,然后把这些碎片组合起来,就构成了清王朝的皇家宝藏的地图,通过这个地图他们也找到了相应的宝藏,这个实际上就是一个分量形态的存储方案,把一份完整的地图分成了若干的分量,只有这些分量全部凑齐,之后才能够恢复出完整的地图出来。
接下来看二分量的秘密共享方案,也就是把一个秘密分成两份,由两个人来进行共享。这里假设分享秘密的是Alice和Bob,他们要共享一个密钥k,怎么来做?方法就是产生一个和消息k一样长的一个比特串r然后再用这个 R和密钥k做一个异或运算得到一个结果s。这个时候这个 r和s就关于这个密钥k的两个子秘密,把这两个子秘密R、S分别分给Alice和Bob。要重构密钥k的时候,Alice和Bob再分别把他们各自手里面的r和s分享出来,然后再做一个异或运算。这个时候可以看到下面的表达式,由于s它是等于k1异或r的,然后这个时候s再来一会儿,实际上就相当于把k一换二两次,也就把这个 k还原了。通过这样一种方式,我们就可以把一个完整的密钥把它分成两个分量,任何一个人只有一个分量是没有办法把这个密钥恢复出来的,只有两个人走到一起,共同把增量拿出来,才能够恢复出完整的密钥出来。
6.2.2.1 Diffie-Hellman 密钥交换方案
接下来我们来学习一下Diffie-Hellman 的密钥交换方案,密钥交换方案又叫密钥协商,简称dh密钥交换算法是最早的密钥交换算法之一,它是让通信的双方在非安全的信道当中安全的交换密钥,这个密钥就是对称会话密钥,用于后续的通讯加密。
我们前面讲的密钥分配协议或者分发协议,它是需要一个安全的信道来进行密钥的分发的,而这个密钥交换或者说密钥协商,它通过非安全的信道由双方来共同协商一个密钥,用于后续的通信。
Diffie-Hellman协议是1976年由Diffie和Hellman两位科学家提出的,被广泛应用于安全领域,比如https协议的TLS也就是传输层安全和IPsec协议当中的IKE,也就是互联网密钥交换,都是以dh算法作为密钥交换算法。其中这个HTTPs它是HTTP这个协议的安全版本,添加了安全的一些功能和这个模块在里面。
接下来我们来看dh算法它的主要原理,这个算法会选一个大的素数p多大的素数10进制300位,以及这个素数它的一个本原根a通常本原根是2或者5,这个 p和a全程公开,
有了这个 p之后就可以形成一个集合Zp*,这个Zp是什么样一个集合?它是小于p且与p互素的所有整数的集合,也就是小于p的整数集合,为什么?因为p它是一个素数,凡是小于p的整数,自然就是与这个 P是互素的。这个时候这个Zp实际上就是从1到p-1这些数字构成的集合。
什么是生成元?这个生成元就是可以用这个生成元去把这个Zp当中的这些数把它生成,怎么样生成?用这个生存元它的幂运算结合模运算,怎么样来运算?就是a的一个幂,然后再模除这个 P比如说a的一次方模除p a的二次方模除p直到a的p减一次方模除p这些计算的结果它们是各不相同的,而且正好可以对应到这个 Zp当中的一个元素,也就是说通过生成元,然后这个做一到p减一次幂运算,然后再来模除这个 p然后它们的计算结果各不相同,正好可以构成Zp*所以它叫做生成元。
有了这个Zp之后,在Zp当中任意选一个数,假设命名为b我们都可以找到唯一的一个指数i,使得这个 b是等于a的a次幂,然后再模除p,就把这个i称作为 b的以a为基的模p的离散对数。这里举一个示例,通过这个示例我想大家就会理解这个离散对数问题。假设我们p选一个小的数,7,素数,然后生成元选a=5,这个时候p=7,Zp就是123456,凡是比7小的数自然都是与这个 p等于7,它是互素的,所以 Zp就是1~6。这个时候我们用这个生成元来进行这个运算,首先是这个生成元的一次幂,然后模除7,它的结果是等于5,然后生成元的二次幂,然后再来模除7=4。接下来5的三次方,然后模除7=6,5的4次方模除7=2,接下来5的5次方,5的6次方分别把结果计算出来。大家注意观察,这一系列的这个生成元的幂运算加模运算它的结果正好是123456,正好构成了这个Zp*。有了这个Zp*之后,就可以从当中选取一个3出来,然后这个3可以唯一的确定它的离散对数为这个5,也就是3等于生成元5的5次幂,然后模除7,它的离散对数就是5。dh算法它的安全性是基于这个离散对数的困难性,离散对数结合前面讲的,它的这个表达式就可以表示成下面这个,也就是b等于 a的i次幂模除p这个实际上它是一个单向函数,也就是说已知这个 i要求这个 b的话,它是容易计算的,但是反过来如果已知这个 b要去求这个离散对数i,它是困难的,所以这就是离散对数的困难性,这也是dh算法的数学基础和安全基础。
介绍完了dh算法它的这个安全基础数学理论基础之后,我们具体来看一下这个 dh算法它的具体方案。有两个用户a和b他们要交换一个密钥用于后续的保密通信,这个时候用户a和用户b就分别各自选一个秘密的数标记为XaXb秘密的数自然是自己把它给保护好,不要泄露出去。然后再接下来双方各自做一个运算,计算一个Ya和Yb也就是说用户a计算一个ya出来,怎么样来计算?就是用这个生成元a然后再用刚才产生的 xa作为它的这个指数,做一个幂运算,然后再模除p就得到了ya同样b也做相同的运算,得到一个yb这一步完成之后,双方就来进行交换,怎么交换?就是 A用户,把它的什么呀 Ya发送给用户b然后用户b同样把它刚才计算得到的yb把它发送给用户a。再接下来用户a和用户b分别再做一个计算,怎么计算用户a就把刚才从b发送过来的yb然后作为底数,然后再用自己的xa来作为指数做一个幂运算,也就是yb的xa次幂,然后再来模除p这个时候得到的结果就等于ka或者说把它标记为ka这个ka就是用户a它通过密钥交换产生的密钥,同样用户b也做相同的操作,把从a那里接收过来的ya作为底数,然后作为一个xb次幂,然后再来模除p就得到了一个KB,这个时候用户a和用户b都各自得到了一个密钥,ka和KB,这两个密钥要相同,才能够作为他们后续保密通信的对称密钥。
这两个密钥相同吗?我们来推导一下,我们知道ka是等于yb的xa次幂,然后再来模除P,这当中有一个ybyb从哪来? Yb是由用户b计算出来的,所以就把用户b计算的yb它的表达式带入到这个表达式当中,这个表达式就变成了 a的xb次幂模除P,然后再来Xa次幂模除P。接下来把这个表达式继续往下推导,把这个模运算根据数论它可以移到外面去,然后就变成了a的xb次幂,再来xa次幂模除p而这个表达式进一步可以把这个 xa和xb把位置给它交换一下,就变成了a的xa次幂。然后再来xb次幂再来模除p进一步根据模运算,我们又可以把这个外面的模除p先把它放到括号里面去,然后再来做幂运算,然后再来做模运算。通过这样变化,我们发现,变化得到这个表达式实际上就是 b用户他计算KB的表达式,所以通过ka通过一系列的推导演变就得到了KB,也就是说ka和KB是相等的,相等的,用户a和用户b就可以用他们各自手里面的这个密钥来作为后续他们俩进行保密通信的会话密钥。
接下来我们再来分析一下这个 dh 密钥交换方案它的安全性。
它的安全性主要就是看攻击者能不能利用公开的信息,然后来把他们俩得到的互换密钥给推导或者计算出来。在这个方案当中,用户a和用户b各自产生了一个xaxb并且是保密的,而其中这个 p和a它是公开的,然后这个用户 a用户b各自计算得到的ya和yb要通过互联网公开的信道来传输,这个攻击者他是可以截获的,所以攻击者手里面掌握的信息就包含了p、a以及这个ya和yb。这个时候攻击者的目标是要计算出这个密钥k也就是ka或者KB,我们以ka举例,ka 是等于yb的x次幂,然后再来模除p的,在这个表达式当中p是公开的,而这个yb是可以通过截获的方式获得的,所以这个表达式当中要计算ka的话,唯一不确定的就是这个 xa。攻击者想要计算k他就必须要想方设法去获得xa而这个xa怎么来获得?xa我们看到它出现在哪个表达式当中? xa出现在了这个 A用户计算ya的这个表达式当中,ya等于a的xa次幂,然后模除P。在这个表达式当中,我们看一看ya是可以通过截获获得的,然后这个底数生成元a它是公开的,而这个模数p也是公开的,只有一个未知数xa是需要计算的。攻击者能否从这个表达式当中计算出xa来,这个xa由于它是这个生成元的指数,也就是它是这个什么呀这个表达式当中这个关于ya的这个离散对数,攻击者要想计算这个xa的话,实际上就是要计算这个离散对数。刚才我们看到,计算离散对数它是一个数学上的困难问题,所以从 ka这个表达式这个角度计算,密钥是不可行的,这就保障了这个 dh算法它的安全性。
如果仅仅是如图当中的简单的dh协议的话,它仍然是存在安全弱点的,因为这个通信的双方它没有进行安全认证,容易受到中间人攻击,中间人攻击就是说在通信的双方用户a和用户b之间存在一个第三方攻击者,比如说是c这个c可以在跟a通信的时候,它假冒成用户b然后跟用户b在通信的时候又假冒成a这个时候通过这个 Dh协议,这个攻击者c就分别可以跟用户a和用户b都协商一个密钥出来,这个时候后续攻击者c它就可以在a和b之间监听和传递这个网络通信。
这里举一个简单的dh密钥交换方案的示例,假设p等于97,a等于5,这个时候用户a和用户b分别秘密的选择一个xa和xb分别是36和58,然后用户a和用户b分别各自计算ya和yb,ya是等于5的36次幂,然后模除97=50,yb是5的58次幂,然后模除97得到44,然后双方就各自把自己计算得到的ya和yb交换给对方,分发给对方,然后再分别计算k这个用户a计算出来的 k等于yb xa次幂,模除97,也就是44的36次幂模除97得到75,然后同样b也计算 ya的xb次幂,然后模除97,就等于50的58次幂,然后模除97,结果也是等于75的。这个事例也印证了双方通过这样的密钥交换方案之后,会得到一个相同的一个密钥,作为他们后续保密通信的密钥。
6.2.2.2 分级密钥的分配
接下来我们来学习分级密钥的分配。
我们首先来看主密钥的分配,主密钥是最高级的密钥,没有更高级的密钥对它进行保护了,所以这个通常采用人工分配的方式是最安全的分配方法,由专职的密钥分配人员进行分配,并由专职的安装人员妥善的安装。二级密钥的分配就可以使用主密钥对它进行加密保护,然后就可以利用公开信道,计算机网络来进行这个传输分配了。
下面是这个二级密钥的一个网络传输分配的一个示意图,发送方,选好了二级密钥之后,就可以用主密钥对这个二级密钥做一个加密运算,然后通过公开网络,把这个加密后的密文传输给接收方,接收方再用相同的主密钥,对这个密文做一个解密运算就得到了二级密钥。
接下来我们再来看初级密钥的分配。
初级密钥分配也可以通过高级密钥,主要是二级密钥来进行一个加密保护来进行分配。通常是把这个一个随机数视为是初级密钥被高级密钥加密后的一个密文。
它的示意图如下,比如发送方产生一个随机数rn然后就把这个随机数通过互联网络传送给接收方,这个时候双方就把这个随机数分别做一个解密运算,与高级密钥,比如说二级密钥,对它做一个解密,解密的结果就得到了初级密钥。
6.2.2.3 公钥密码体制分配密钥
接下来我们来讲一下利用公钥密码体制来分配密钥,利用公钥密码体制也可以用来分配密钥,也就是说分配会话密钥,这里相当于把公钥密码体制当做是一个高级密钥,或者说二级密钥来分配会话密钥,我们看一下如何来分配。
这里有一个示意图,假设通信的双方是Bob和Alice,这个时候首先Bob它就产生一个会话密钥,然后采用公钥密码体制,Bob就用接收方Alice他的公钥KUa然后加密这个会话密钥,然后把这个加密后的密文发送给Alice接收方。Alice收到这个密文之后,由于是用她的公钥加密的,她就可以用他自己的私钥对这个报文进行解密,把这个会话密钥KS简明出来,有了这个会话密钥之后,双方就可以进行后续的保密通信了。下面就是保密通信的过程,就不再赘述了。
这是一种常见的密钥分配方案,正好发挥了公钥密码体制和对称密码体制两种密码体制的优缺点,这个呃对称密码体制适合加密大量的数据,所以用来对保密通信进行这个加密,而这个公钥密码体制它的开销要大一点,所以用它来加密小的数据量,也就是加密会话密钥,把它当做二级密钥来使用。
利用这个公钥密码体制来分配会话密钥,实际上是斯坦福的Merkle提出来的这个建议方案,他的方案具体是这样的,这个用户a想要跟用户b来进行保密通信,先它会发送一个请求报文给用户b相当于是一个保密通信的一个申请,发送的报文是KUa和IDaIDa就是用户a的ID,告诉这个用户b是谁要跟你通信,然后KUa就是用户a的公钥,通过这个报文就告诉用户b是谁要跟你通信,然后这个人他的公钥是什么,这个用户b有了用户a的公钥之后,它就可以产生一个会话密钥ks然后用用户a公钥KUa来对这个会话密钥进行加密,从而使用用户a的公钥来加密传送这个会话密钥。
这个方案有一个问题,就是会受到中间人攻击,接下来我们就来看一下中间人攻击它的原理。
根据刚才Merkle的方案,用户a要与用户b进行保密通信,首先它要发送一个请求报文,然后把自己的ID和自己的公钥发送给用户b用户b收到这个报文之后,然后它就产生一个会话密钥ks,然后用刚才收到的用户a的公钥对这个会话密钥加密,然后把这个密文返回给用户a。接下来如果用户a和用户b之间有一个中间人c他还发起一个中间人攻击,他怎么来攻击?这个时候首先用户a同样发送这个请求给用户b中间人就把这个报文截获了,同时把这个报文中间的用户a的公钥给它替换,替换为它自己的公钥,然后再把这个请求报文继续发送给用户b,用户b收到这个中间人发送的这个请求之后,他根据这个报文当中的IDa然后他仍然以为是用户a在跟他进行通信,那它就产生一个会话密钥,然后根据刚才Merkle的方案再用刚才收到的报文当中的公钥来加密这个会话密钥ks,这个时候实际上这个请求报文当中的公钥是中间人攻击者c的这个公钥,这个 b就把这个嗯用 c的公钥加密的会话会话密钥返回回去,中间人把这个报文同样截获了,由于这个报文是用它的公钥来加密的,所以中间人攻击者,他就可以把这个报文做一个解密,提取出这个会话密钥出来,到这儿还没完,中间人把这个得到的会话密钥再继续用a的公钥加密再返回给a到这儿 a收到这个报文之后,用他自己的私钥把这个会话密钥解密出来。这个时候用户 a用户b手里面就有了这个会话密钥ks同时中间人手里面也有这个会话密钥ks,而且用户a和用户b他们是不知道中间人存在的,这个时候当用户a和用户b在进行后续的他们以为的保密通信的时候,中间人实际上可以全程的监控他们的通信,因为中间手里面也有这个会话密钥ks,之所以这个中间人攻击会成功会得逞,是因为这个通信的双方他们之间是没有认证和鉴别的,就是用户b和用户a他们是没有办法识别对方的身份是否是真实的,所以当中间人发送信息给用户b的时候,他没办法验证这个用户是a还是其他的人,而且用户a发送给用户b的这个请求报文,他的公钥被篡改了,用户b接受到这样一个报文之后,它没有办法检测这个公钥是否被篡改了,所以就产生了中间人攻击。这个也引出了公钥管理的问题,公钥是可以公开的,但是我们看到通过这个中间人攻击这个公钥被篡改了,引起了很大的安全性问题。
6.2.2 对称密码体制的密钥分配
接下来我们首先来看对称密码体制的密钥分配,大家回忆一下对称密码体制它的加密模型,通常要求通信的双方在通信之前,通过安全的信道来分发密钥,密钥的分配通常使用协议来完成,这个协议通常包含分发协议,还有就是协定协议。
密钥的分发协议就是系统当中的一个成员选择一个密钥,然后通过安全的信道把它传送给其他成员。比如说发送方选择一个密钥,然后通过安全信道把它发送给接收方,反过来也可以由接收方选择一个密钥再把它发送给发送方。
密钥协定协议又叫做密钥协商协议,是系统的两个或多个成员在公开的信道上联合建立密钥,两个成员的密钥协定协议有时候又叫做密钥交换协议,而有些协议它既是密钥分发协议,也是密钥协定协议,就是这两种协议的一个组合。
接下来我们来看一下密钥分配的技术。直接分配,就是通过安全性到一方产生密钥,把它直接发送给另外一方,这个方式就不再细讲。主要介绍下面的几种,一个是密钥分配中心KDC的方式,一个是Diffie-Hellman的密钥交换方法。还有就是分级密钥,分别他们各自是如何来分配的?
我们接下来看密钥分配中心KDC的方式,这是一种当前主流的方式。KDC是一个可信的第三方,专门用于对称密码体制的密钥分发的这样一个机构。KDC事先与每一个用户共享一个二级密钥,也就是说密钥加密密钥,比如这个系统当中有用户a和用户b,事先KDC就与用户a建立一个二级密钥Ka与用户b建立一个二级密钥KB,这个时候用户要进行通信的话,就向KDC来发出一个申请一个会话密钥,然后KDC生成会话密钥之后,就用与用户共享的二级密钥,把这个会话密钥返回给我们用户。
这里我们看一个例子,假设用户a和用户b想要进行保密通信,首先我们用户a就发送一个请求信息给KDC这个信息就包含了通信的双方的ID,也就是我们第一条消息,IDa、IDb。KDC收到这样一条消息之后,他知道用户a和用户b要进行保密通信,需要他来为他们产生一个会话密钥,也就是产生一个用于保护会话的初级密钥。KDC这个时候它就生成一个KS,然后再产生一个当前的时间戳t,然后分别用用户a和用户b跟它的这个二级密钥来加密一个消息,再返回给用户a这个消息比较长比较复杂,首先KDC是把这个 IDa KS会话密钥和时间戳,用这个与用户b共享的二级密钥KB来加密,得到一个密文,然后再把这个密文加上会话密钥ks与这个时间戳t还有就是这个IDb一起再用用户a的二级密码 ka来加密,然后发送给用户a,用户a收到这样一条比较复杂的消息之后,他就用与KDC共享的二级密钥ka来对它做一个解密运算,他就可以得到会话密钥ks以及时间 t用这个时间来验证这个密钥的以及这条消息的时效性。然后这个 idb实际上就是KDC告诉他这个会话密钥是用于你和这个用户b来进行通信的这个密钥,这个解密出来的后半段用这个 KB来加密的信息,是kdc为用户b产生的这个消息,这个时候用户直接把这个加密的密文用KB加密的这一串密文,然后再抄送给用户b就可以了。用户b收到这个密文之后,同样用它与kdc的二级密钥KB来做一个解密预算,就得到了ida ks和t同样用时间戳来验证这个消息的时效性,然后得到这个会话密钥ks用于后续的保密通信,然后这个 Ida实际上是KDC告诉他是谁要想和你进行保密通信。这个消息3就是KB加密的这一串密文是用户a它不能产生的,也就是说其他用户不能伪造的,而只有KDC它是可信的由它来产生。用户b收到这个消息之后,包括用户a收到这些加密消息之后,他们是可以信任这些消息的,避免第三方的攻击者进行这个假冒。这个过程完了之后,用户a和用户b他们就各自都有了这个 ks,他们就后续可以使用这个密钥来加密他们的会话通信了。
KDC分配方案的优点是用户不用保密这个工作密钥可以实现这个一报一密,也就是说用户你不用管这个密钥不用存,你在每一次需要使用密钥的时候,向我KDC来申请,我给你下发一个就完了,每一次会话都可以去申请一个新的密钥,从而提高这个安全性。缺点是通信量比较大,在通信之前就需要跟KDC来进行一系列的交互,需要有较好的鉴别功能,也就是说通过一个鉴别功能来识别KDC和用户,用户跟KDC在进行通信之前先来进行一个身份的认证。
6.3 公钥的管理
6.3.1 公钥管理问题的提出
下面我们来学习公钥的管理,首先来看公钥管理问题的提出,公钥密码体制跟对称密码体制它的密钥管理有着本质的区别,主要体现在如下两点:
第一点:密钥的形式上面有差别,由于公钥密码体制通常算法基于单向性的函数一些数学难题,所以它需要满足一些数学上面的性质。比如RSA要求,基于大素数来构造密钥。
第二点:再来看要求对称密码体制要求密钥保密,所以在使用之前需要进行一个安全的分发或者协商,而公钥密码体制,公钥是可以公开的私钥自己保管,这两者要求是不一样的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B89rM03d-1687881204888)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
我们再来看前面看到过的中间人攻击,有两个用户a和b ,a首先发送它自己的ID和它的公钥给这个用户b,b收到之后,然后产生会话密钥,然后再用刚才a发送的这个消息当中的公钥,加密这个会话密钥,再返回给a,a收到之后就可以通过试钥解密获取这个会话密钥,然后后续他们双方就可以用会话密钥来进行保密通信了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KD6n7wl-1687881204894)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]
如果存在一个中间人攻击者c的话,c就可以首先截获a发送给b的信息,然后把其中的a的公钥替换为它的公钥,b收到之后,他并不知道这个中间人攻击者存在,它依然会产生他的会话密钥,然后用这个刚才接收到的公钥来加密这个会话密钥,然后发送给这个发送方a。这个时候实际上这个公钥是c的公钥,所以 c他就可以截获这个信息,然后用自己的私钥把这个会话密钥解密出来,然后继续他再用a的公钥把这个会话密钥加密再发送给a。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEDeBWqd-1687881204896)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]
这个时候 a和b以及c都有了这个会话密钥,而且 a和b他们是不知道中间人攻击者c的存在的,后续他们在使用会话密钥ks进行保密通信的时候,这个保密通信对攻击者c就是透明的,它就可以解密。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4gwaQxq-1687881204897)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]
中间人攻击之所以能够成功,它的原因在于(1)中间人攻击者他可以伪造公钥,也就是可以;(2)假冒合法用户的公钥,从而破坏了公钥的完整性和真实性。所以公钥密码体制它的公钥是公开的,并不代表它不需要保护。虽然它不需要保密,但是它需要保护它的完整性,真实性;(3)保证攻击者不能修改或者替换通信接收方的公钥。
问题来了,怎么样来公开这个公钥,不能在公开的媒体上面不加保护的直接公布,需要有相应的验证机制来验证公钥的真实性完整性,验证公钥跟所有者是否是匹配的。
这个公钥和私钥这一对密钥与持有者用户他是对应的或者说应该是绑定的,这个就让我想到了身份证,身份证其中的核心就是身份证号是一个个人的ID,比如现在的身份证号都是一个18位的这样一个一串数字,如何来防止身份证号被假冒,大家看图片是一个身份证,就用身份证将用户的身份证号跟身份信息绑定在一起,并且由这个权威的机构国家的公安机关来进行颁发,这个权威机构会对它进行相应的签名,权威机构会对身份证进行一个签名,其实质就是进行防伪,这个签名以及防伪手段它是可以进行验证的。通过这个防伪的技术,就可以保障这个身份证,如果被假冒的时候我们可以识别出来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pih2TWsU-1687881204898)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)]
6.3.2 公钥数字证书
我们来学习公钥数字证书,公钥管理的解决方案如下,首先将公钥跟身份绑定,如何来绑定?用一个实体公钥数字证书来进行绑定,然后由一个可信的第三方来做担保,通常是一个权威机构-CA证书机构来对证书进行管理、签发,其他用户就可以凭借公钥证书,然后去验证。怎么来验证,由于公钥证书上面有这个CA的签名,我们就可以通过验证签名,从而去验证公钥证书它的完整性真实性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtxVGElG-1687881204899)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]
这里我们将这个数字证书与身份证做一个两相对比,来看一下数字证书它的大体结构。数字证书首先是主体的身份信息,也就是这个公钥持有者他的身份信息,这个对应身份证上的身份信息,然后就是主体的公钥,就可以对应身份证上面的身份证号。接下来就是CA名称,就是这个证书是由哪个CA来签名颁发的,对比公安局的名称,还有一些其他的信息,包括这个数字证书它的有效期用途等等,也可以对比到我们身份证上面的其他信息。最后就是需要有一个颁发机构CA的签名,对比我们身份证上面相关的防伪标识。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9xR2KdG-1687881204902)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]
通过这样一个对比的话,我们会发现数字证书确实跟身份证是非常的相似。
下面我们来说明一下证书,公司要和认证机构的关系,如下图所示,证书是一个实体,包含了用户的相关信息,然后其中的核心的数据就是这个公钥,公钥来自于用户的一对公私钥,一对密钥当中的公钥拿出来放到证书上面,然后这个证书的主体数据组织好之后,就需要认证机构CA来对它进行一个签名,CA签名就是用它的私钥来对证书做一个签名运算,然后把这个签名再把它附加到用户的证书上面,那这个时候这个证书就构造好了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldvZoMx2-1687881204903)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)]
公钥证书它的主要的数据结构核心就是三个,用户的身份信息,也就是用户的标识,然后就是用户的公钥,最后就是CA的签名。生成了公钥证书之后,这个公钥证书生成了公钥证书之后,它的存储和分配就不再需要保护了,用户可以通过公钥证书来交换各自的公钥.就可以通过对上面的签名来进行验证,从而确认公钥证书它的真实性和完整性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LSIkzRk-1687881204904)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg)]
公钥证书的具体形式是这样的,首先是用户的ID,就是用户的标识,然后还有就是用户的公钥,还有就是签发机构ID,然后还需要加一个时间,这个时间用来保障或者标识公钥证书它的时效性,通常有效期起始时间,然后还需要就是CA对这个公钥证书的签名。这个签名是CA对公钥证书首先它要做一个哈希运算,将公钥当中的关键数据时间戳、ID、用户的公钥以及这个 CA的ID这几个数据项一起来做一个哈希运算,签名CA再用他的私钥对这个哈希来做一个解密运算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y86k3msL-1687881204906)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)]
用户在验证这个证书的时候,首先需要用这个CA它的公钥对这个签名做一个加密运算,然后得到一个哈希,然后再将这个当前这个证书上面的几个关键数据项时间戳ID、公钥、CA的ID等等这几项再做一个相同的哈希运算,那这个时候得到两个哈希,然后做一个比对,如果相同的话,说明这个证书它是完整的真实的。如果不相同说明这个证书它是有问题的,可能受到了攻击,受到了修改。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wt7wpl5x-1687881204907)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)]
下图说明了证书的产生过程,首先就是用户产生一对公私钥,然后私钥自己保管好,公钥拿出来与用户的身份信息、用户的ID一起交给CA,CA再用他自己的一对公司要当中的私钥来对这个用户的姓名和公钥等等这些数据一起来做一个签名预算,就产生了证书。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHJNJQKf-1687881204909)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)]
同样是用户a和用户b首先用户a向用户b发送一个请求信息,包含了用户a的ID以及它的公样钥数字证书。b收到这个信息之后,首先它需要做一个验证,验证公钥数字证书它的真实性和完整性,验证公钥证书是否真的是来自于用户a的,同时验证一下公钥证书它是否是完整的。如果这两方面都没有问题,用户b产生会话密钥,然后再用用户a的公钥证书上面的公钥,加密这个会话密钥返回给用户a,这个时候他们就可以用这个会话密钥来进行通信了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlN4cht8-1687881204911)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)]
在使用公钥证书的情况下面如果仍然存在攻击者c,我们来看一下攻击者c它的攻击能否得逞?攻击者c可以拦截用户a发送给b的信息,这个时候它就有两种攻击方式,一种是用自己的证书去替换a的证书,在这种情况下面,用户b它是很容易识别的,因为证书上面有用户的身份信息,他发现这个证书上面的身份信息跟 a发送信息的ID不吻合,自然就发现了这个攻击问题。另外攻击者也可以去篡改用户a发送的他的公钥证书,用他自己的公钥去替换证书当中的a的公钥。这种情况下面,用户b收到这个经过篡改后的公钥证书之后,他会发现这个公钥证书它是不完整的,也就是说存在篡改,所以这两种情况下面,攻击者c都是不能得逞的,b它都可以察觉出来,自然这个中间自然这个中间攻击就没办法成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRdsAjot-1687881204913)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)]
6.3.3 数字证书的类型结构和验证
下面我们介绍一下数字证书的类型结构和验证。
数字证书的类型从证书的最终使用者来看,可以分为系统证书和用户证书。系统证书是CA系统自身的证书,CA它也需要有一系列的证书,然后用户证书就是普通用户使用的证书,用来交换各自的这个公钥。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuJpCNXv-1687881204915)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg)]
从证书的用途来看的话,又可以分为签名证书和加密证书。签名证书就是对用户的信息进行签名,确保这个不可否认性,而加密证书就是对用户传输的信息进行加密,确保真实性和完整性。所以在实际的使用当中必须为用户配对,所以在实际的使用当中必须为用户配置两对密钥,一对用来做签名,一对用来做加密,并且在实际的使用当中必须为用户配置两对密钥和相应的证书,一对用来做加解密,另外一对用来做签名。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EY2eRfbE-1687881204916)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)]
我们再来看证书的结构,目前广泛采用的证书格式是国际电信联盟ITU提出的 x.509v3格式,v三代表它的版本,这个证书的结构有许多基本的证书域和扩展域构成,扩展域包括个人的信息,个人的身份信息、社会保险号、驾照号码等等。还有就是企业的信息,企业的工商注册号、组织机构代码、税号等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cTlV1hMY-1687881204917)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg)]
证书的种类从应用上面来看的话,又可以分为个人证书、企业证书、VPN证书和服务器证书。从用途来看的话,就是我们刚才看到的签名证书和加密证书。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vXeFP5o-1687881204919)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image035.jpg)]
这张表就是我们刚刚提到的x.509证书的这个具体格式,包括了版本,证书序列号,算法的标志符,还有参数颁发者,起始时间用来标识证书的有效期,持证者就是证书持有者,他的姓名和标志符,还有就是证书公钥算法以及相应的参数。另一个关键数据就是证书上面的公钥,还有就是证书它的数字签名。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wv3YtKxE-1687881204920)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image037.jpg)]
下面我们再来看证书的验证,证书的验证主要是验证证书颁发者他的签名,也就是CA的签名,CA的签名是用它的私钥来签名的,所以验证他的签名就需要使用他的公钥。
CA的公钥又来自哪里?CA的公钥又来自于CA的证书,我们后面会看到CA的证书又是由它的上级CA来颁发的,所以要验证一个证书,首先要获取签名CA他的证书,然后用证书当中的公钥去验证他的签名。具体而言,这个验证工作需要确定以下几个内容,首先就确定刚才说的CA的签名,看一下这个签名是否是真实的。然后另外就是验证证书它是否是完整的,也就是比对证书它的哈希值,然后另外还要确定证书它是否是处于有效期的,然后还要确定证书有没有被撤销。有些证书它即便仍然处于有效期,但是如果因为一些特殊的原因,比如说证书对应的是要泄露了那,这个时候证书虽然还有效,但是会被注销。另外就是还需要验证证书的使用方式与声明的策略和使用方式是否是一致的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9ZG2V9q-1687881204922)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image039.jpg)]
6.3.4 数字证书的使用
下面我们来学习数字证书的使用。首先来看基于证书的认证,这里有两端,客户端和服务端,客户端请求访问服务器的这样一个单项鉴别过程如下,这个单项鉴别就是只有一方验证另外一方的身份,这里就是只有服务器验证客户端的这个身份。首先客户端向服务器发送一个请求。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WN3jZ7y9-1687881204923)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image041.jpg)]
服务器就进行应答,要求出示证书,客户端就提交发送他的证书给服务器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7BHpZmqy-1687881204924)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image043.jpg)]
服务器首先要验证这个数字证书它的真实性和完整性,它首先需要去获取这个证书颁发机构CA它的公钥证书去验证,验证完成之后,它还需要验证这个客户端是否是这个证书它的合法的持有者,因为证书实际上是公开的,每个用户原则上都可以获取任何其他人的证书。
服务器怎么来验证?服务器会发起一个随机数的一个自寻,它会产生一个随机数,然后用这个证书当中的公钥对它进行加密,发送给客户端,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ty8DSXx-1687881204925)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image045.jpg)]
这个时候客户端如果它是这个证书的合法持有者的话,它就可以使用证书对应的私钥来解密刚才加密的这个随机数,然后再将这个解密的随机数返回给服务器,然后服务器他通过收到这个随机数跟他自己产生随机数做一个对比,如果是相同的,就可以证明这个客户端确实是这个证书的合法持有者。如果不相同的话,说明这个客户端他的这个证书是别人的证书,不是他自己的证书。这个通过这个过程,服务器就可以验证客户端的身份。
下面我们来看一下基于web的认证,SSL、TIS这两个协议他们的认证过程。这个认证跟刚才看到认证过程正好相反,它是客户端,然后去认证服务器的身份,这是基于一个web的通信过程。首先代表客户端的web浏览器,像 web服务器发起一个请求,服务器返回它的证书给客户端,客户端浏览器首先去验证这个证书的真实性和完整性。如果验证通过的话,进一步它会产生一个随机数,作为一个会话密钥,然后把这个会话密钥用证书当中的公钥加密,再发送给服务端,服务端如果它是这个证书的合法持有者的话,它就可以使用对应的私钥来对这个会话密钥进行解密。解密完了之后,通信的双方就有了相同的会话密钥,他们就可以进行后续的保密通信。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSeiE1x3-1687881204926)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image047.jpg)]
这个认证过程,就是今天使用的https的工作过程,其中这个s就代表安全,因为它包含了一个这样认证过程,以及后续的加密在里面,证书还可以使用在电子邮件当中,大家可以打开你们的邮件客户端,比如说windows提供的邮件客户端,在这个邮件服务器的属性里面,我们可以看到这个安全的标签里面有两个部分,一个部分是签署证书,也就是支持在书写邮件的时候,我们可以选择相应的证书来进行签名。另外下面这个部分就是加密的部分,我们也可以选择相应的证书和相应的算法来实现这个加密或者实现加密密钥的这个传输。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyNma2Bq-1687881204928)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image049.jpg)]
下面加密的部分,我们也可以选择相应的证书和相应的算法,让其他的邮件使用者可以通过这样一些证书和算法来跟我们进行保密的通信。
计算机系统很多时候会透明的方式来使用证书,系统当中预装了一些证书,同时也会收集一些证书。怎么去查看这些证书?我们可以通过internet的选项里面去查看,在这个内容标签里面,可以看到证书这个部分,把它点开的话,就可以看到系统当前已经拥有的证书,我们可以具体打开一个证书,去看看这个证书不同的字段都是什么样的,具体的数据是什么。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23g03CI8-1687881204929)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image051.jpg)]
当然我们也可以使用windows系统当中带有的证书管理工具,然后去管理证书。我们可以在运行里面运行命令certmgr.msc然后打开这个 Windows的证书管理器,然后在当中去查看各种类型的证书,有个人的,有企业的,有第三方的等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbTU2bZH-1687881204932)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image053.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewWksig4-1687881204933)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image055.jpg)]
选定了这些证书之后,我们可以进一步的查看证书的具体的数据。
下面我们来介绍证书的另外一种使用代码签名。我们日常生活当中频繁的使用各种软件或者APP,这些软件APP在发布过程当中容易受到攻击,被攻击者、置入、木马或者病毒,从而威胁我们系统或者信息的安全。我们可以使用证书来保证软件代码的完整性和真实性。软件开发商可以对他的软件代码进行数字签名,这个数字签名就可以标识软件的来源,开发者的真实身份,然后并且保证这个代码它的完整性不被恶意篡改。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaGMoxQj-1687881204935)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image057.jpg)]
有了这个签名之后,我们普通的用户就可以验证这个代码的真实性和完整性。比如通常用户在网络当中下载安装软件的时候,往往系统会弹出一个这样的用户账户的控制出来,然后可以在这个弹出的窗口当中去查看这个软件发布者他的信息,主要是他的证书信息,我们可以看到这个软件是由谁发布的,然后它的证书是什么样的,并且可以看到它的证书路径当中它是一个链条,证书又是证书又是由上级的机构来颁发的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3O38zBY-1687881204940)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image059.jpg)]
下面我们来看一下这个代码签名证书它的一个具体过程。首先就是软件发布者向相应的CA机构,比如说VeriSign申请这个数字证书,有了数字证书之后,他在发布它的软件代码的时候,首先对这个代码进行签名,当然这个需要借助代码签名工具,实质的这个其核心的操作就是计算代码的摘要,然后再使用这个证书对应的私钥,对这个代码的摘要就是哈希进行一个签名,然后再来发布包含了这个签名和签名证书的这个软件包,也就是把签名、签名证书以及这个软件整个代码一起打包进行发布。普通用户,获取了这个软件发布者它的这个软件包之后,就要来验证这个代码签名证书,验证发布者它的真实性可信性。首先就使用这个证书,它的签发CA,他的公钥证书。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CffqiPUl-1687881204942)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image061.jpg)]
软件用户获取了软件发布者的软件包之后,首先要验证代码的签名证书,验证发布者他的可信性,如何来验证软件发布者,他的证书是由他的CA来颁发的,所以我们需要找到CA它的公钥证书,去验证软件发布者证书的有效性。这个CA的证书又是由它的上级机构,比如说VeriSign颁发的,通常这个上级机构它的更正书已经事先嵌入到用户的可信更正书库当中了,直接去取就可以了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJiRok6h-1687881204944)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image063.jpg)]
验证完了证书的有效性之后,接下来还要验证代码的完整性,验证代码的完整性与消息认证的原理类似。首先就使用这个签名证书,公钥去解密被签名的这个哈希值,就获取了这个软件发布之前的这个哈希也就是软件发布前的这个摘要,然后再来使用同样的哈希算法,产生一个代码的当前哈希,这个就是软件发布之后的摘要。然后接下来就比对这两个摘要,如果这两个摘要是相同的话,说明这个软件在发布过程当中它是完整的。就是软件发布之前和软件用户获取之后,这两个代码是相同的,没有被篡改。如果这两个哈希值是不相同的,说明在软件发布过程当中,可能受到了一些攻击,它的哈希值变了,指纹变了,当然整个过程当中对用户来说是透明的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LlmFyL2p-1687881204945)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image065.jpg)]
上述过程往往对普通用户来说是透明的,当然用户也可以去查看软件发布的提供的一些提示信息。
我们再来介绍数字证书的另外一个应用-数字信封。假设有甲乙两个用户要进行保密通信,他们需要有一个会话密钥,也就是对称密钥对他们的通信过程进行加密。前面我们介绍的对称密钥使用的过程,首先需要有一个安全的通道来进行会话密钥的交换。有了数字证书之后,就不需要事先进行会话密钥的交换了,如何来做?首先甲产生会话密钥,对要通信的信息进行加密,然后完了之后再使用接收方以他的证书当中的公钥对这个会话密钥做一个加密,然后接下来再将刚才加密后的信息和这个加密后的这个密钥一起发送给接收方乙,乙收到之后,首先用他的私钥来对这个会话密钥做解密,解密之后得到了会话密钥,然后占用这个会话密钥,进一步去解密具体的消息,然后完成消息的解密。这个就是数字信封,也就是将要保密通信的信息和这个使用的密钥一起经过加密之后发送给对方。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rO5Yla37-1687881204948)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image067.jpg)]
下面我们再来看数字信封加签名的这个方案,首先用户生成好要通信的信息,然后做一个哈希运算,得到这个信息它的摘要,然后再使用自己的私钥来做一个签名。然后接下来产生一个会话密钥,对这个有签名的这个信息做一个加密,加密之后这个会话密钥在使用数字信封用对方的公钥来进行加密,最后把这几个部分组合起来一起发送给对方。对方首先去解密这个会话密钥,用自己的私钥解密得到会话密钥,然后再用这个会话密钥去解密加密的完整信息,解密完了之后,最后再来验证这个签名,这个就是数字信封和签名结合的这样一个完整方案。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rOvfQPEf-1687881204949)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image069.jpg)]
6.4 公钥基础设施PKI
我们前面介绍了公钥数字证书,公钥数字证书实现了把公钥与持有人的身份绑定在一起,就解决了公钥的完整性和真实性问题。
公钥数字证书又如何来管理,通过公钥基础设施PKI来完成。PKI公钥基础设施,它是负责管理公开密钥和证书的管理平台,他负责公钥以及证书的生成、存储、分发、使用、验证和撤销,为所有网络应用透明的提供加密和签名所需的密钥和证书管理。
PKI是美国最早在1996年推动建设的。在1998年电信行业建立了我国第一个行业的CA,此后金融、工商、外贸、海关和一些省市也各自建立了自己的行业CA和地方CA,这里的CA就是PKI的核心认证机构。
6.4.1 PKI的逻辑结构
接下来我们来学习一下PKI的逻辑结构,这里是PKI的逻辑结构图,最下面是PKI的策略和软硬件系统,然后这个策略和软硬件系统它的上一层有这个证书机构CA,也就是PKI的核心,然后还有这个注册机构ra和证书发布系统,这一套机制就像上层的PKI的各种应用,提供数字证书。
接下来我们来看一下证书机构CA,它是PKI的核心,它是一个可信的第三方实体,通常是国家认定的权威机构受所有用户的信任。CA又分成两类,一类是公共CA,通过internet为大众提供认证服务,另外就是私有的CA,是由公司或者组织内部架设的这个 CA系统。
我们再来看CA的功能,CA负责用户的密钥和证书的发放、更新、废止、认证等管理工作,
具体来看密钥管理 .CA负责密钥的产生、备份恢复以及密钥的更新。前面讲的公钥密码体制,它的密钥产生是比较复杂的,具有较高的要求,比如说基于大的素数,普通用户有可能他不具备深层产生密钥的这个条件,所以有时候需要CA系统来为用户来产生备份恢复以及密钥的更新。
第二就是颁发证书,CA要负责颁发证书,颁发证书它首先它要验证用户的公钥是否是合法的,然后审查认证实体的身份,也就是公钥持有人他的身份跟公钥他是否是匹配的,完成之后验证通过,它就可以签发证书了。就是在公钥证书上面,然后用自己的私钥来签发来签名,然后CA还负责证书的验证,要验证证书的有效性、可用性、真实性,另外还要进行这个证书的废除和更新。一旦用户的这个证书过期或者用户的私钥泄露了,这个时候用户就要申请更新私钥和更新证书,并且废除原证书,这些都是像CA来申请,通过CA来完成这些工作。
接下来我们来介绍注册机构RA,当系统当中的实体数量用户数量增加以后,如果前面CA的全部工作都由CA来完成的话,那这个时候他的负担就会比较重,而成为系统的一个瓶颈。这个时候 CA就可以把它的一些功能然后分离出来交给RA注册机构来完成。这个RA就充当CA和用户之间的一个中间实体,辅助CA来完成一些证书处理的功能。比如说接收和验证新注册用户他的注册信息,然后代表最终用户生成密钥,接收和处理密钥的备份和恢复请求,然后接收和处理证书的撤销请求。
接下来我们看证书颁发系统CDA。证书颁发系统主要是颁发证书,一旦CA为用户生成了证书之后,用户可以自己来发布,同时也可以通过证书颁发系统来向外进行发布。这个证书颁发系统它的核心是一个证书库,它实质上就是一个网上的公开信息库,用来集中的存放公钥数字证书,用户从此处获得自己或者其他用户的证书,这个证书库的实现方式,可以通过X.500,轻量级的目录访问协议LDAP,web服务器、FTP服务器、域名服务器、数据库服务器等等来实现,用户可以根据实际的需求来选用。大型企业级的PKI一般通过使用X.500目录服务和轻量级的目录访问协议LDAP来实现,其中这个X.500是被国际标准化组织 ISO接受的这个目录服务系统标准。
我们前面讲的密钥它是有生命周期的,公钥证书它的核心是公钥,它也有它的生命周期。我们来看一下数字证书它的生命周期是什么样的,首先要产生一对公私钥要然后再拿这个一对公私钥当中的公钥来申请证书,然后由CA或ra来审核证书,然后接下来由CA来签发证书,然后用户安装证书使用证书,然后在使用过程当中,如果有需要,比如说证书出现了泄露或者证书使用过程当中出现了一些其他的问题,这个时候可以申请费废止证书,然后再撤销证书,然后另外就是更新证书,这个证书的生命周期就结束了。
这里有一张图,大家介绍一下这个一般证书的申请流程,首先就是用户它产生一对公私钥,当然这一对公私钥也可以让注册机构ra来负责,帮他完成。这个时候假设用户是自己的一对公私钥的话,他就可以把他的公钥交给注册机构去提出这个证书的申请。这个注册机构负责对他的公钥进行这个一定的审核完成之后,把这个证书申请交给认证机构CA,CA就把这个用户的证书以及他的身份信息做一个绑定生成这个证书,并且进行签名,完成之后,证书生成好了,CA机构就把这个证书发布到证书资料库,也就是证书的颁发系统里面去,同时还要把这个证书通过ra再返回给用户,这个时候用户拿到了证书,他就可以具体来使用了。比如说我们手机的信用卡里面,IC卡,包括银行使用的u盾等等里面,往往都是嵌入了公钥数字证书的。另外通过证书资料库,也就是证书颁发系统,用户也可以去查询调阅他的证书或者其他用户的证书。
6.4.2 PKI的体系结构
接下来我们来介绍一下PKI的体系结构,PKI的体系结构主要分为三类单CA结构、层次CA结构和交叉CA结构。
首先我们来看单CA结构,这个是PKI的基本结构,这个系统当中只有一个CA为全部的用户提供这个 PKI服务,所有用户都信任这个CA,当这个 PKI的规模增大,CA管理所有的实体所有用户的身份就会比较困难,这个时候CA它就可以将它的权力授予一个或多个子CA,而这些子CA还可以再进一步的指派子CA,直到某一级的CA颁发实际用户的证书,这样就形成了层次结构,层次结构正好可以反映现实社会当中的各种组织的架构和关系。比如说高校,有学校这一层,然后在学校这一层以下,还分了若干的学院,学院下面又分了若干的系,系下面可能分了若干个年级,然后再分到班。接下来我们来介绍交叉认证结构,往往不同的组织可能会有自己的CA系统,当这个隶属不同的CA系统用户,他们要进行这个交互或者进行认证的话,这个时候就需要使用交叉认证结构,通过这个信任传递建立横向的信任关系,比如下面这张图当中的示例,有一个铁道系统,还有一个银行系统,它们各自都是一个层次的一个CA结构,这个时候假设铁道系统的一个用户跟银行系统一个用户要进行这个交互,进行认证,进行保密通信,这个时候就需要铁道系统和银行系统进行一个交叉认证,在某一个层级,然后通过交叉认证建立起横向的信任关系。比如这张图当中,铁道分公司CA和银行分行CA它们两者之间在这个层级上进行这个交叉认证,交叉认证就是各自在对方的证书上面加一个自己的这个私钥签名,通过交叉认证,不同系统当中,在交叉认证内级CA下面的子CA以及实际签发证书的用户,他们就可以相互的认证对方的证书,从而实现安全的公钥证书的使用。在实际应用当中,很多CA是采用层次的结构,由于有层次结构的CA存在,所以用户他的端实体证书由他的上层CA来签发的,而它的上层CA又有更上层的CA来签发,一直到一个最顶层的CA,最顶层的CA,由于它没有更高层的CA给他签发证书,所以最顶层的CA它是一个自签证书,又叫做根证书,这样由一系列CA签发的证书,直到端实体证书就构成了一个证书链。这个目前的证书市场基本被Symantec、VeriSign等等这样一些机构垄断,形成了证书链之后,证书的验证就要验证整个链条,从端实体证书开始,然后必须要验证证书链上每一个证书是否都有可信的CA签发,每一个证书它是否是完整的,直到达到一个可信的根,也就是可信的根证书。
6.4.3 我国主要认证机构及案例
接下来我们来看一下我国主要的认证机构及案例。我国的认证机构主要分为三类,行业CA、区域CA和纯商业CA,各个省几乎都建立了各自的 CA系统。这里我们列举一些主要的CA,包括中国金融认证中心CFCA,中国电信认证中心CTCA,上海市电子商务安全证书管理中心SHECA等等。
接下来我们来看一下一个PKI的案例,网上银行,这个是一个招商银行,它是一个三层的CA结构,由于所有的中国银行都是由中国人民银行来管理,所以招商银行它的上层是中国人民银行的根CA,然后招行的品牌CA负责制定CA的总体策略,然后它的下层是个人ca签发系统,负责按照上级ca的政策为不同类型的业务制定政策,并为最终的用户颁发证书。CA系统的下面有一个ra系统,这个RA系统和业务系统结合,包括这个总行的数据中心,分行数据中心、业务柜台等等,这些业务系统负责收集用户的资料,然后通过ra传送给CA系统,然后由CA系统来结合用户的信息来进行这个相应的审核,并签发最终的证书。