首页 > 代码库 > 网络通信中的加密解密及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详解