为了保证网络通信安全,就对其数据进行加密和解密,涉及了密钥分发;
网警公司为http协议通信安全研发了一个库,放在应用层和传输层中间,这个库就叫ssl安全的套接字层,ssl是一个库,是公共功能,加密解密也是协议实现的;
只要应用层的程序在研发时加入了调用ssl这个库,在通信时就会自动完成加解密,实现后续网络通信;
SSL: Secure Sockets Layer
http --> ssl --> https
http协议调用ssl后,就变成了https协议,两者实现方式差别很大,但是加密解密也带来了cpu的开销;
安全的目标:
保密性:confidentiality
完整性:integrity(不产生信息丢失)
分为数据完成性和系统完整性
可用性:availability
攻击类型:(被动攻击、主动攻击)
威胁保密性的攻击:窃听、通信量分析;
威胁完整性的攻击:更改(modification)、伪装()、重放(replaying)、否认(denial)
威胁可用性的攻击:拒绝服务(DoS)
ddos分布式拒绝服务攻击
解决方案:
技术(加密和解密)、服务(用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务)
加密和解密:
传统加密方法:替代加密方法(例如奇数字符后移3位,偶数字符前移3位)、置换加密方法
现代加密方法:现代块加密方法
(把数据切割正固定大小的块,对每一块进行加密,且块之间有关联)由置换单元、替换单元、异或运算单元、位移要素、对换要素等等一系列组成;例如把第一块加密后发给对方,再把第二块与第一块的一行运算发给对方,截取不到完整数据包也不可能查看数据,过程非常复杂;
任何未加密的数据就是明文,加密就是使用某种算法转换成另一种形式的数据就称为密文;解密就是把密文使用解密算法,就得到了明文;所以加密安全性不能依赖于算法本身,而要依赖于参与者;算法是可能被人分析出来的;
通信对端通过何种方式拿到对端的密钥,就显得非常重要;
服务:
认证机制
访问控制机制
密钥算法和协议:
就是为了解决密钥交换的服务;是在加密和解密、服务中用到的密钥算法和协议;
(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也不能看的数据内容;
如果B用私钥加密后发送给A,当有C从中截取数据时,C也能看的数据内容,因为公钥是公共的,能解密,这样加密的意义,在于验证发送者的身份验证;
公钥加密有两重功能,数字签名和密钥交换;
数字签名的实现原理:
就是验证发送者身份,公钥加密比对称加密的速度要慢很多,当文件很大时,会很浪费资源,只是为了进行身份验证,不会对整个文件进行加密,而是使用md5或sha1等单向加密算法对文件(加密)提取特征码,(单向加密特性是无论文件大小,加密后定长输出一般md5是128位输出,sha1是160位,还有sha256,sha384,sha256,sha512等),因此,B用自己的私钥加密这个特征码后,把文件和文件的特征码一并发送给A;
,A收到后第一步先用B的公钥解密这个特征码,进行身份验证确认是A发过来的,第二步还能验证完整性,能解密出来得出特征码,A使用相同的单向加密算法计算文件的特征码,与解密出来的特征码进行比较,相同则认为数据没有被修改过,从而验证的了数据完整性;因此,这种方式能保证两个层面的验证即第一身份验证,第二完整性验证;
但是数据的保密性没能保证,数据在传输过程中任何人都能看到,当然C也能看到甚至还能验证文件是B发送的,就是保密性没有得到保证;
为了增加保密性又多了一个机制:(见下图)
B要发送数据给A,B用单向加密算法先计算出数据的特征码,并使用自己的私钥加密这个特征码生成数字签名这就叫数字签名,即加密特征码的过程就是数字签名的过程;主要用于保证接收方能验证发送方的身份和数据完整性,但不能保证数据保密性;
下一步,B用对称加密算法(这个对称密钥是B自己生成的一次性对称密钥),结合密钥来加密整个数据(数据+特征码)成为密文,为了保证让A能解密,B用A的公钥加密这个对称加密的密码并附加在文件数据后面,发送给A;(用A的公钥加密的信息只能用A的私钥解密)
解密过程:
A收到密文后,先用自己与公钥配对儿的私钥解密这个文件,解密后得到密码,这个过程就叫密钥交换(用对方的公钥加密一个密码发送给对方,只有对方能解密这个密码);这个密码是用来实现对称加密和解密的密码,所以A就得到了密钥,继续解密这个数据(数据+特征码);
当在传输过程中C得到B发送给A的文件后,首先C没有A的私钥解密不了里面的密码,其次也没有对称加密密钥,就解密不了加密的数据;
从而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的公钥特征码,还要用同样的加密算法计算特征码与之加密出来的特征码进行比较;一样则证明证书的内容没问题是可信的;
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.服务器端会话断开;
双方通信结束;