为了保证网络通信安全,就对其数据进行加密和解密,涉及了密钥分发;


网警公司为http协议通信安全研发了一个库,放在应用层和传输层中间,这个库就叫ssl安全的套接字层,ssl是一个库,是公共功能,加密解密也是协议实现的;

只要应用层的程序在研发时加入了调用ssl这个库,在通信时就会自动完成加解密,实现后续网络通信;

SSL: Secure Sockets Layer

 http --> ssl --> https

spacer.gifwKiom1cH69uCUOdSAAH8XHkJCMU062.png

http协议调用ssl后,就变成了https协议,两者实现方式差别很大,但是加密解密也带来了cpu的开销;


安全的目标:

  保密性:confidentiality

  完整性:integrity(不产生信息丢失)

     分为数据完成性和系统完整性

  可用性:availability


***类型:(被动***、主动***)

  威胁保密性的***:窃听、通信量分析;

  威胁完整性的***:更改(modification)、伪装()、重放(replaying)、否认(denial)

  威胁可用性的***:拒绝服务(DoS)

    ddos分布式拒绝服务***

    

解决方案:

  技术(加密和解密)、服务(用于抵御***的服务,也即是为了上述安全目标而特地设计的安全服务)


加密和解密:

  传统加密方法:替代加密方法(例如奇数字符后移3位,偶数字符前移3位)、置换加密方法

  现代加密方法:现代块加密方法

    (把数据切割正固定大小的块,对每一块进行加密,且块之间有关联)由置换单元、替换单元、异或运算单元、位移要素、对换要素等等一系列组成;例如把第一块加密后发给对方,再把第二块与第一块的一行运算发给对方,截取不到完整数据包也不可能查看数据,过程非常复杂;

wKioL1cH7SmD2MSKAAB65kKoCdc496.png

wKiom1cH7HrQ3HXgAADGKvoaUtc092.png


任何未加密的数据就是明文,加密就是使用某种算法转换成另一种形式的数据就称为密文;解密就是把密文使用解密算法,就得到了明文;所以加密安全性不能依赖于算法本身,而要依赖于参与者;算法是可能被人分析出来的;

wKiom1cH7LPwfu2DAAD7891WMpc336.png

通信对端通过何种方式拿到对端的密钥,就显得非常重要;


服务:

  认证机制

  访问控制机制


密钥算法和协议:

  就是为了解决密钥交换的服务;是在加密和解密、服务中用到的密钥算法和协议;

(1)对称加密算法:

(2)公钥加密(非对称加密)算法:

(3)单向加密算法:

(4)认证协议:


Linux系统:可通过OpenSSL(ssl协议), GPG(pgp协议)两种工具完成上述解决方案;

OpenSSL由三部分组成:

  libencrypto(加密解密)库:专门实现加密解密功能;

  libssl库:用于实现ssl安全通信机制的库;

  openssl多用途命令行工具


加密算法和协议:四种

(1)对称加密:加密和解密使用同一个密钥;加密算法和解密算法可能不同;

常见对称加密算法: DES、 3DES、 Blowfish加密算法、 Twofish加密算法、  IDEA、RC6、 CAST5

特性:

1、加密、解密使用同一个密钥;

2、将原始数据分割成为固定大小的块,逐个进行加密;

缺陷:

1、密钥过多;

2、密钥分发困难;


 (2)公钥加密:密钥分为公钥与私钥,成对儿出现;

 公钥:是从私钥中提取出来的;可公开给所有人;pubkey

 私钥:是通过工具创建的,使用者自己留存,必须保证其私密性;secret key;

特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;


公钥加密的工作原理:

每个密钥都成对儿出现,公钥加密有两重作用是数字签名和密钥交换,公钥的公开的,私钥自己留存,但是公钥和私钥都能用于加密和解密,就有了2种发送方式;第一种是通信双方即A和B,A发送数据给B,A使用B的公钥加密后发送给B,只能用B的私钥才能解密,当有C从中截取数据时,C也不能看的数据内容;

wKiom1cH7yGTiB3-AADC-1wRl7k522.png

如果B用私钥加密后发送给A,当有C从中截取数据时,C也能看的数据内容,因为公钥是公共的,能解密,这样加密的意义,在于验证发送者的身份验证;

wKiom1cH76aQc_2kAADZBRJE4MA267.png


公钥加密有两重功能,数字签名和密钥交换;


数字签名的实现原理:

就是验证发送者身份,公钥加密比对称加密的速度要慢很多,当文件很大时,会很浪费资源,只是为了进行身份验证,不会对整个文件进行加密,而是使用md5或sha1等单向加密算法对文件(加密)提取特征码,(单向加密特性是无论文件大小,加密后定长输出一般md5是128位输出,sha1是160位,还有sha256,sha384,sha256,sha512等),因此,B用自己的私钥加密这个特征码后,把文件和文件的特征码一并发送给A;

wKioL1cH896B9zwCAAD6ZmII8Ag756.png

,A收到后第一步先用B的公钥解密这个特征码,进行身份验证确认是A发过来的,第二步还能验证完整性,能解密出来得出特征码,A使用相同的单向加密算法计算文件的特征码,与解密出来的特征码进行比较,相同则认为数据没有被修改过,从而验证的了数据完整性;因此,这种方式能保证两个层面的验证即第一身份验证,第二完整性验证;

wKiom1cH80nQro_VAAEDup8pn2g630.png

但是数据的保密性没能保证,数据在传输过程中任何人都能看到,当然C也能看到甚至还能验证文件是B发送的,就是保密性没有得到保证;


为了增加保密性又多了一个机制:(见下图)

B要发送数据给A,B用单向加密算法先计算出数据的特征码,并使用自己的私钥加密这个特征码生成数字签名这就叫数字签名,即加密特征码的过程就是数字签名的过程;主要用于保证接收方能验证发送方的身份和数据完整性,但不能保证数据保密性;

下一步,B用对称加密算法(这个对称密钥是B自己生成的一次性对称密钥),结合密钥来加密整个数据(数据+特征码)成为密文,为了保证让A能解密,B用A的公钥加密这个对称加密的密码并附加在文件数据后面,发送给A;(用A的公钥加密的信息只能用A的私钥解密)

wKiom1cH9BnhqcaDAAIUtnxEtpE109.png

解密过程:

A收到密文后,先用自己与公钥配对儿的私钥解密这个文件,解密后得到密码,这个过程就叫密钥交换(用对方的公钥加密一个密码发送给对方,只有对方能解密这个密码);这个密码是用来实现对称加密和解密的密码,所以A就得到了密钥,继续解密这个数据(数据+特征码);

当在传输过程中C得到B发送给A的文件后,首先C没有A的私钥解密不了里面的密码,其次也没有对称加密密钥,就解密不了加密的数据;

wKioL1cH9cLDJ-UMAAHFz49iUzY970.png

从而A拿到文件数据后用自己的私钥解密密钥,用密钥解密数据,得到数据,然后用B的公钥来解密这个签名即特征码,验证身份,再用单向加密算法计算文件特征码与解密的特征码进行比较,进行完整性验证;

以上仅是点到点的通信机制;这样就保证了身份验证,完整性验证和保密性,三种加密算法全用到了:单向加密、对称加密、公钥加密;这个过程公钥加密算法的两种作用:身份验证,密钥交换;


梳理:

身份认证的实现:

发送方用自己的私钥加密数据特征码,接收方用对方的公钥解密,如果加密成功即可实现身份认证,因为公钥的成对出现的,私钥只有自己有,公钥所有人都有;


数字签名的实现:

在身份验证中就依赖到了数字签名,发送方用自己的私钥加密数据特征码这个结果就叫数字签名;

因此,数据签名就为了完成身份验证的;


密钥交换的实现:

自己先生成一个密码,要用对方的公钥加密这个自己生成的密码,然后发送给对方,只有对方能解密,对方解密出来的就得到密码了;所以就能使用这个密码来解密使用对称加密方式加密的数据了;

如AB双方要进行通信,不可能使用公钥加密数据来通信,因为公钥加密性能太差,安全性很高,双方要使用对称加密,双方拿到对方的公钥(密钥),取决于谁是客户端,谁是服务端;请求者拿到对方的公钥,自己生成一个密码用对方的公钥加密后,再发给对方,对方使用自己私钥解密即可,所以密钥就知道了,接下来整个通信过程就使用这个密钥来加密解密了;


总结描述整个过程:

B与A通信:

B加密数据,发送给A:

第一步:B先用单向加密算法计算出数据的特征码;

第二步:B用自己的私钥加密这个特征码,并将结果附加在数据后面;

第三步:B生成一个临时对称密钥,并使用对称密钥加密整个数据;

第四步:B获取A的公钥,并使用A的公钥加密这个临时的对称密钥,将结果附加在整个数据后发送给A;


A收到数据,解密:

第五步:A先用自己是私钥解密这个加密的对称密钥;

第六步:A用对称密钥解密整个加密的数据;

第七步:A用B的公钥解密数据的特征码;验证了B的身份;

第八步:A再用同样的对称加密算法计算数据的特征码,并与解密出来的特征码进行比较;验证了B发送的数据的完整性;从而使用这种手段保证了保密性和完整性还同时完成了身份验证;


以上过程存在一个巨大风险,如果C把自己的公钥提供给了AB双方,C伪装成B,让A认为C就B,这样A就把自己的公钥发送给C,C再伪装成A,让B认为C就A,B就把自己的公钥也发送给了C;这样AB双方的每次通信,都是经过中间的C看过一遍了,这叫做中间人***;因为AB双方无法相互确认对方的身份;


如何避免中间的环节;问题在于如何可靠获取对方的公钥环节上,就有了认证CA;

CA就是双方都认可的第三方可信机构;

A把自己的公钥提请给CA,由CA对这个公钥做一些特殊防伪技术处理后即称为证书,再发给A;以后任何人与A通信,A就把着这个经过CA加工过的公钥发给对方;

如B向A要公钥时,A就把证书(公钥)发给B,B会第一验证这个证书的内容是正常合法的,第二且是自己所信任的CA颁发的;以上两步得到验证即证书(公钥)得到验证;

证书里包括了拥有者的公钥,还包括拥有者各种信息;此时C要想冒充伪装成A或B,则不能成功;

找到信任的CA是重要的,那么如何验证CA;

证书中包括:拥有者名称、公钥、证书有效期,最重要的是CA会用自己的私钥加密这个证书的特征码,即数字签名;放在证书最后;

假如B收到A的公钥时,先用CA的公钥解密这个A的公钥特征码,还要用同样的加密算法计算特征码与之加密出来的特征码进行比较;一样则证明证书的内容没问题是可信的;

wKiom1cH9iKhgiJvAAJO0QFdh6k654.png


B如何可靠获得CA的证书;CA为了让别人能验证它所发的证书是CA所发的,所以CA把自己的公钥提请给每一个信任它的人;为了使得整个法则是完整的,所以CA就先给自己发了一个证书(包括CA的信息和CA的公钥);因此,只有拿到CA的证书才能获得CA的公钥,才能解密CA的签名,才能验证CA发给它人的证书;

所以,只有当面交易CA的证书才可靠;申请证书时CA要审查各种信息;CA在全球有很多从属关系,是有信任关系可传递的;有根CA,下面有很多派出CA信任关系可传递;

CA是让通信双方能够可靠的获取到对方公钥的一种基础保证机制;如果有人私钥丢失,向CA申请吊销证书作废;还有别人如何知道证书作废等一系列过程;


公钥加密用途:

  数字签名:主要在于让接收方确认发送方的身份;

  密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方,以实现密钥交换;

  数据加密:功能同数字签名;

                

公钥加密算法:RSA(是公司名、创建者首字母、算法名), DSA, ELGamal(商业算法)

  DSS: Digital Signature Standard:仅能实现签名;

  DSA:Digital Signature Algorithm:即能签名又能加解密;

            

(3)单向加密:即提出数据指纹(特征码);只能加密,不能解密;

特性:定长输出、雪崩效应;

功能:实现完整性验证;

常见算法:

md5:Message Digest 5, 128bits

sha1:Secure Hash Algorithm 1, 160bits

sha224, sha256, sha384, sha512

密钥算法:

密钥交换: IKE(Internet Key Exchange)

1、公钥加密:实现密钥交换;

  密钥是在网上发送的;

2、DH(Deffie-Hellman)算法

  不发送密钥就能使双方完成密钥交换;


(4)认证PKI:Public Key Infrastructure

公钥基础设施:包括四部分

  签证机构:CA

  注册机构:RA

  证书吊销列表:CRL

  证书存取库:

            

X.509v3:国际标准化组织定义了证书的结构以及认证协议标准,x.509有三版本;

  版本号:x.509的版本号;

  序列号

  签名算法ID:签名的使用算法;

  发行者名称:CA的名称

  有效期限

  主体名称:证书拥有者名称;

  主体公钥:

  发行者的惟一标识

  主体的惟一标识:证书拥有者

  扩展

  发行者的签名:CA的签名;


加入CA的通信过程描述:

A和B通信,检查证书:

通信之前双方都要获得彼此的公钥,因此事先要获得对方的公钥,协商使用加密算法;

双方要验证对方的公钥,第一,用CA的公钥解密CA的签名,能解密说明证书的来源可靠;第二,用同样的加密算法加密证书,计算出的特征码与解密出的特征码比较,相同说明证书的完整性可靠;第三,检查证书有效期;第四,验证主体名称是否为对方的名称;第五,检查证书是否被吊销;

注意:CA的证书是自己发的叫自签名证书;任何CA要想给别人发证书第一步先要给自己发证书,才能给别人发证书;

在不同主机间进程通信时,通过ssl加密,自动完成通信加密的,无需人工手动操作;


ssl的认证过程:

第一阶段:安全握手

1.客户端生成一个随机数RNc,并同client_hello信息发送给服务器端;

2.服务器收到后,会生成一个随机数RNs,并同server_hello信息发送给客户端;

此时双方都得到了对方的随机数;协商双方各自共同使用的算法,如;公钥加密算法、单向加密算法、对称加密算法、密钥交换的方法;

第二阶段:

3.服务器把自己的证书发给客户端;

4.并且请求客户端的证书;

5.客户端检查服务器的证书(检查证书的签发者CA、证书内容没问题、证书有效期、证书的主体名称是否一致、证书没有吊销、服务器端的公钥);

第三阶段:

6.客户端把自己的证书发给服务器端;服务器端还要检查客户端的证书(方式同上);

(一般客户端都没有证书,除非使用网银,要使用电子密码当证书来验证客户端)

7.都没问题,客户端把前面信息进行hash方式做计算,使用自己的私钥签名后发给服务器端;服务器端检查hash算法和签名;

8.都没问题,客户端生成随机的对称加密密钥(pre-master-secret)PMS,于是用服务器端的公钥(从证书中得到的服务器端的公钥)加密这个对称加密密钥后,发送给服务器端;服务器端用自己的私钥解密,得出密钥,服务器端就用这个密码加密客户端请求的网页内容,发送给客户端了;

第四阶段:

9.客户端请求通信结束,会话断开;

10.服务器端会话断开;

双方通信结束;