首页 > 代码库 > 网络通信中的加密解密及openssl和创建私有CA详解

网络通信中的加密解密及openssl和创建私有CA详解

1、为什么网络通信要进行数据加密?

我们在网络进行通信时候,如果数据以明文的方式传输,在传输过程中,数据可以被篡改、窃听、伪装等,如图:

技术分享

当A向B通信时,C可以在数据传输的过程,将数据进行抓包,例如应用wireshark抓包软件,就可以抓取通信的数据包,进行对抓到的内容进行分析,得出传输数据的内容。

2、数据加密方式有哪些?

从分类上划分,加密技术有四种:

1)对称加密

◆ 对称加密:加密和解密使用同一个密钥

      ·DES:Data Encryption Standard,56bits

      ·3DES:

      ·AES:Advanced (128, 192, 256bits)

      ·Blowfish,Twofish

      ·IDEA,RC6,CAST5

◆ 特性:

      ·加密、解密使用同一个密钥,效率高;

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

◆ 缺陷:

     ·密钥过多;

     ·密钥分发;

      ·数据来源无法确认

◆ 事例说明:其实我们平时用的最多的加密方式就是对称加密算法,比如我们使用通过https的方式浏览网页。只是在进行页面数据传输前,通过非对称加密的方式来传输对称秘钥,后面会详细介绍。


2)非对称加密(公钥加密)

◆ 非对称加密采用公钥加密,同时还需要另一个秘钥来解密,也就是私钥;两者统称为密钥对。

      ·公钥:从私钥中提取产生,公开给所有人;public key

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

◆ 特点:

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

◆ 功能:

      ·身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥能解密,即可认证其身份;私钥加密的这个过程为数字签名。

      ·密钥交换:与被通信方之前,首先获取到对方的公钥,自己生成一个加密密码,用对方的公钥加密,并发送给对方;

      ·数据加密:适合加密较小数据(不常用,比对称加密要慢3个数量级)

◆ 缺点:

      密钥长,加密解密效率低下

◆ 算法:

      RSA(加密,数字签名),DSA(数字签名),ELGamal


◆ 基于一对公钥/私钥对

      用密钥对中的一个加密,另一个解密

◆ 实现加密过程:

       ·接收者

           生成公钥P和私钥S

           公开公钥P,保密私钥S

       ·发送者

           使用接收者的公钥P来加密消息M

           将P(M)发送给接收者

       ·接收者

          使用私钥S来解密:M=S(P(M))

◆ 实现数字签名:

       ·发送者

           生成公钥/私钥对:P和S

           公开公钥P,保密密钥S

           使用私钥S来加密消息M

           发送给接收者S(M)

       ·接收者

           使用发送者的公钥来解密M=P(S(M))

           结合签名和加密

           分离签名

事例说明:我们在银行办理网银时,银行提供的U盾就是含有公钥的证书。银行之所以当面提供U盾,就是以一种可靠的方式把公钥给我们,防止被冒充。记得以前在网页使用支付宝的时候,也必须要要下载加密控件,这也是含有公钥的证书,用来加密数据。

    

3)单向加密

◆ 只能加密,不能解密,因为解密过程是一个二次加密的过程;主要是提取数据的特征码,即“数据指纹”

◆ 特性:

       ·任意长度输入

       ·固定长度输出

       ·若修改数据,指纹也会改变(“不会产生冲突”)

       ·无法从指纹中重新生成数据(“单向”)

◆ 功能:

       数据完整性(完整性校验)

       系统账号密码校验

◆ 算法:

       md5:Message Digest 5(消息摘要),128bits;

       sha1:Secure Hash Algorithm 1(安全哈希算法) ,160bits

       sha224,sha256,sha384,sha512

事例说明:我们平时访问网站,需要注册账号密码,网站就是以单向加密的方式,将密码加密放到数据库,我们在下次输入认证时,网站程序根据相应的加密算法加密我们提供的密码数据,与数据库里加密的密码进行对比,网站就是基于这种方式进行认证的,所以网站后台服务器也不知道我们的明文密码,这就是当你的密码忘记时,只能修改的原因了。当然,我们提供原始密码给网站是,也是通过加密传送的。


4)密钥交换

◆ 密钥交换(IKE):双方通过交换密钥来实现数据加密解密;密钥交换有两种

公钥交换:将公钥加密后通过网络传输到对方进行解密,这种方式很有可能别截获破解,不常用;


 DH:双方共有一些参数,共同协商加密算法,除此之外双方还有属于自己的私有参数,通过共有参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双反计算后的结果是相同的,而这个结果就是密钥。

        如:A有p和g两个参数,A还有一个属于自己的私有参数x;

          B有p和g两个参数,B还有一个属于自己的私有参数y;

          A和B有相同的加密算法即:

              A:p^x%g

              B:p^y%g

          然后双方交换计算后的结果,此时

          A拿到B的p^y%g,B拿到A的p^x%g,双方再和自己私有参数进行相同的算法,即

              A:对p^y%g 再求x次方得(p^y%G)^x=p^xy%g

              B:对p^x%g 再求y次方得(p^x%G)^y=P^xy%g

          最后A和B的结果是一样的


  注意:整个过程中对于第三方人员来说只能获取p,g两个值,AB双方交换的是经过计算后的值,因此这种加密算法是很安全的。


3、通信中是如何进行数据加密的?

当Tom要向Jerry通信时,在网络世界A和B肯定是素未谋面的,如果使用非对称加密,那么Tom、Jerry肯定要先交换公钥,用来加密传送的数据。如下图:

技术分享

Tom和Jerry通过公共网络交换公钥,TOM和Jerry通过对方的公钥加密数据,用自己的私钥解密数据,看似天衣无缝,大家有没有想过,在通信链路上,会有第三个人,在TOM向Jerry通信时,冒充Jerry,在Jerry通信时,在冒充Tom。然后Tom和Jerry看似两个人通信,实则有个中间人,不停的窃取信息,过程如图:

技术分享

当Tom向Jerry发送公钥时,第三方jack冒充Jerry,接受到Tom的公钥,并将自己的公钥发给Tom,Tom以为一直在和Jerry通信,其实是在Jack通信。

如何避免这种情况呢?

这里就不得不提到PKI了:公钥基础设施

先说明几个概念:

◆ PKI: Public Key Infrastructure

 公钥基础设施:

       签证机构:CA(Certificate Authority)

       注册机构:RA

       证书吊销列表:CRL

       证书存取库:

◆ X.509:定义了证书的结构以及认证协议标准

       版本号:version

       序列号:serial number CA用于唯一标识此证书;

       签名算法标志:

       颁发者:即CA自己的名称;

       有效期限:两个日期,起始日期和终止日期

       主体名称:证书拥有者自己的名字

       主体公钥:证书拥有者自己的公钥信息

       发行者的唯一标识:

       证书主体的唯一标识

       CRL分发点:

       扩展信息

       发行者签名:CA对此证书的数字签名

◆ 验证证书过程:

     1.用CA的公钥去解密CA的全名,能解密说明证书来源可靠;

     2.用同样的加密算法去加密证书取得特征码,与解密出的特征码相比较,如果二者相同,说明证书完整性可靠;

     3.检查证书的有效期限在不在当前合理的有效范围内;

     4.验证主体名称和期望通信的对方是否一致;

     5.检查证书是否被吊销。

◆ 证书类型:

      证书授权机构的证书

      服务器

      用户证书

◆ 获取证书两种方法:

     1.使用证书授权机构;

          生成签名请求(csr)

          将csr发送给CA

          从CA处接收签名

     2.自签名的证书;

          自已签发自己的公钥


上面在介绍非对称加密是也说过了,非对称加密的缺点是加密速度慢,所以在进行数据传输时,我们是不使用非对称加密的。而是使用公钥加密对称密码,传输给对方,私钥进行数据签名。利用CA证书,进行公钥认证

具体是如何实现的呢?

看下图:

技术分享加密过程说明:

1)Tom和Jerry利用非对称加密算法获得一对公钥私钥,利用公钥向证书颁发机构CA申请证书;

2)Tom需要和Jerry通信时,会将双发的公钥发给对方,对方通过根证书验证,防止证书被验证;

3)Jerry向Tom发送数据时,Jerry会利用某种单向加密算法,提取data的特征码,再利用自己的私钥加密特征码,形成数字签名(数据签名是为了实现身份认证);Jerry会生成一个随机对称秘钥,用于加密Tom请求的数据、特征码和数字签名,然后用Tom的公钥加密随机对称秘钥。最后将这一段数据通过网络发送给Tom。

4)Tom收到数据,利用自己的私钥解密,得到对称密钥,进而用对称密钥解密得到data、特征码和数字签名;使用同一种算法来计算data的特征码,与Jerry发来的特征码对比,如果相同,数据 的完整性得到验证;用Jerry的公钥解密数字签名,能够解密,Jerry的身份得到验证。

CA证书最主要的功能就是认证我们要访问的服务器公钥有权威性;而公钥是可以公开的,为了加密传送的数据(一般是用来加密对称密钥的);对此密钥是临时随机生成的,为了更快的加密解密数据。

4、https方式进行数据传输的具体流程

下面来说说PKI的具体实现,我们以SSL(安全套接字层)为例。
http是超文本传输协议,https就是以ssl为基础的超文本传输协议,我们平时上网,像支付宝网站使用的就是https协议。为什么呢?因为支付宝涉及到金融方面,当然要加密。但是现在百度也用https了,上面说过了,数据加密传输会导致传输过程变慢,那百度又为什么使用https协议呢,因为如果不加密,我们申请的页面在中途可以被网络运营商添加了其他数据(比如广告)。

流程如下:

技术分享

具体的四个阶段说明:

第一阶段:ClientHello:

     支持的协议版本,比如tls 1.2;

     客户端生成一个随机数,稍后用户生成“会话密钥”

     支持的加密算法,比如AES、3DES、RSA;

     支持的压缩算法;

第二阶段:ServerHello

     确认使用的加密通信协议版本,比如tls 1.2;

     服务器端生成一个随机数,稍后用于生成“会话密钥”

     确认使用的加密方法;

     服务器证书;

第三阶段:

     验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)

     发送以下信息给服务器端:

     一个随机数;

     编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

     客户端握手结束通知;

第四阶段:

     收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;

     向客户端发送如下信息:

     编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

     服务端握手结束通知;

5、SSL 的工具实现 OpenSSL

本文出自 “汪立明” 博客,请务必保留此出处http://afterdawn.blog.51cto.com/7503144/1872753

网络通信中的加密解密及openssl和创建私有CA详解