一、数据加密和解密概述
数据加密和解密是一门历史悠久的技术,从古代就已经出现了,一直发展到当代。其中,数据加密的目的有很多,可以是为了保证本地数据存取的安全性,可以是为了保证数据流在网络传输过程中的保密性,也可以是为了验证数据的完整性,还可以通过数据加密来实现密钥的交换等。
数据加密依赖于某种加密算法和加密密钥,而数据解密则依赖于某种解密算法和解密密钥。而在当代加密解密技术中,加密密钥既可以与解密密钥相同,也可以和解密密钥不同,这取决于使用什么方法进行加解密。
二、安全的目标
就信息传输过程来说,安全目标有以下三个要点:
(1)保密性:确保通信双方之间的通信数据不会被无关的第三方所窃取,这是最基本的要求。
(2)完整性:确保通信时数据不会丢失或被第三方篡改、破坏,一旦数据丢失或被篡改时,通信的一方能够立即发现。
(3)可用性:确保授权用户能够按需合法访问资源。
三、安全攻击类型
对应于以上的安全目标,分别有以下三种攻击类型:
(1)威胁保密性的攻击:窃听/窃取、通信量分析;
(2)威胁完整性的攻击:篡改、伪装、重放、否认;
(3)威胁可用性的攻击:拒绝服务(Dos)、分布式拒绝服务(DDos);
四、安全防范的解决方案
为了防范安全攻击,可以分别从技术层面上和服务层面上防范:
(1)技术层面:提供加密和解密技术。这个层面解决了本地数据存储加密和通信过程中数据加密的一系列问题,可分为传统加密算法和现代加密算法:
①传统加密算法:替换加密算法、置换加密算法;
②现代加密算法:现代块加密方法
(2)技术层面:提供用于抵御攻击以及为了达到上述安全目标而特地设计的服务。在这一层面上主要有认证机制和访问控制机制:
①认证机制:确定访问资源的用户是谁、通信对方的身份是否为期望的另一方等;
②访问控制机制:确定某个用户是否有权限访问资源;如果有权限访问资源,再进一步确定用户所能够访问的资源以及对资源能够执行的操作(查看、使用、修改、创建等);
在以上技术和服务这两个层面中会用到的密钥算法和协议有对称加密、公钥加密(非对称加密)、单向加密以及认证协议。接下来介绍在实现安全通信过程中所用到的加密算法以及它们的实现。
五、加密算法和实现
1、对称加密
(1)特点:加密和解密使用同一个密钥;通信时,双方要想实现基于对称加密算法来实现通信需要预先共享密钥。
(2)用途:用于实现数据保密性。
(3)常见算法:
①DES:Data EncryptionStandard(数据加密标准)。DES算法是以64bits(8Bytes)为块,在加密端把数据分成多块,对每块数据(64bits)进行加密,生成64bits密文;在解密端则把64bits密文转换为64bits明文。各个块之间建立一定的联系,DES使用16个迭代块来完成迭代。其中,加密和解密使用56bits密钥。
②3DES:Triple DES(三轮DES加密机制)。3DES加密次数是DES的三个数量级(10^3)。
③AES:Advanced Encryption Standard(高级加密标准)。AES支持多种变长密钥,如128bits,192bits, 256bits, 384bits等。
④其它对称加密算法有:Blowfish, Twofish, IDEA, RC6, CAST5等。
Note:DES算法存在缺陷,而且只使用56bits的密钥太短;为了提供更高的安全性,可使用DES的派生算法3DES来进行加密,但3DES算法和DES算法一样存在可被攻击的缺陷。后来DES被AES所替代。
(4)缺陷:
①密钥过多:如果通信是基于C/S模式,则服务器端与每一个客户端之间的通信都必须使用不同的密钥,造成服务器端密钥过多的问题。
②密钥分发困难:对称加密可实现通信时数据加密功能,但问题是双方通信之前必须交互密钥,而密钥在交换过程中也同样保证保密性,这时会造成密钥分发困难的问题,必 须依赖于一种安全的方法来实现密钥的交换。
2、非对称加密
(1)特点:也称为公钥加密。加密和解密数据使用不同的密钥,例如用公钥加密的数据只能使用与之配对的私钥进行解密,而用私钥加密则只能使用与之配对的公钥进行解密。相比于对称加密,公钥加密可把公钥直接公开,即使公钥在通信时被窃取,因为没有与之配对的私钥,所以仍然无法解密数据。
①公钥:public key,从私钥中提取产生,可公开给所有人。
②私钥:secret key,通过工具创建生成,由使用者自己留存,必须保证其私密性。
(2)用途:
①数字签名:主要用于让接受方确认发送方的身份。
②密钥交换:通过对方的公钥加密一个对称密钥,并发送给对方,对方通过其私钥解密之后就可以获取对称密钥了。这解决了上述对称加密算法中密钥分发困难这一问题。
③数据加密:这种直接使用公钥加密算法来实现通信时数据的保密性的方式并不常用,因为这种方式要比使用对称加密慢上3个数量级,不推荐。
(3)常见算法:
①RSA:名称由RSA三个提出者(Ron Rivest, AdiShamir, Leonard Adleman)的姓氏首字母组合而成,这种算法的可靠性由对极大整数做因数分解的难度决定;RSA既能实现数字 签名,又能实现加解密。
②DSA:Digital Signature Algorithm,即数字签名算法,又称DSS(Digital Signature Standard, 数字签名标准);DSA仅能实现数字签名,不能用于加解密。
③其他公钥加密算法有ELGamal等。
(4)缺陷:通信效率低。
3、单向加密
(1)特点:提取数据特征码,只能加密,不能解密,它是基于两个特性。
①定长输出:提取出来的数据量是定长的,与进行加密的数据的量无关。
②雪崩效应:初识条件的微小改变会引起加密结果的巨大变化。
(2)用途:用于实现数据完整性的验证。
(3)常见算法:
①md5:Message Digest 5,即信息摘要,'5'是版本号;取出的特征码定长为128bits。
②sha1:Secure Hash Algorithm 1,即安全哈希算法,'1'是版本号;取出的特征码定长为160bits。
③其他的单向加密算法还有:sha224、sha256、sha384、sha512 ...分别表示定长输出224bits、256bits、384bits、512bits...
Note:CentOS 5用户密码加密使用的是md5,CentOS 6/7用户密码加密使用的是sha512.
4、密钥交换(IKE, Internet Key Exchange)
两种实现方式:
①公钥加密:常见的算法有RSA等。
②DH算法:Deffie-Hellman(迪菲-赫尔曼)算法。
③其他用于实现密钥交换的算法有:ECDH(椭圆曲线DH)、ECDHE(临时椭圆曲线DH)等。
以下为DH算法的工作原理图:
一般的过程:
1.Alice生成随机自然数a、随机大质数p和原根g;
2.Alice计算,计算结果为A,并把p,g,A发送给Bob;
3.Bob生成随机自然数b,根据Alice发过来的p,g,计算,计算结果为B;
4.Bob把B发送给Alice,并计算,计算结果为K;而Alice计算,计算结果也为K;
5.Alice和Bob以K值作为密钥进行通信。
Note:在整个密钥协商过程中,p、g、A、B和的值是可以公开给攻击者的,而a,b,K值是不公开的。问题关键在于:通过传递的A= g^a%p和B=g^b%p,其实也就是传递的是A B g p的值按照数学的算法反推能求出a b的值,但是现在计算机还不能满足这样的要求,所以a b分别为Alice和Bob所私有,对方都不知道,何况攻击者了,这样双方计算出K值(最终Alice和Bob协商好的密钥)了,这个问题就是著名的离散对数问题。
六、一次加密通信的过程
以发送方Alice和接收方Bob为例,Alice向Bob发送报文,怎么才能保证Alice的报文安全、可靠地被Bob接收到,并且保证报文数据的完整性?接下来围绕着这个问题来说明一下。。
网络传输中主要问题
数据传输
解决方案
实现步骤
1、发送数据未被修改
利用单向加密提取数据特征码(相当于数据指纹)
在数据准备发送的时候提取数据的特征码,在收受到数据后提取其特征码与之前的特征码对比,保证数据的完整性。
2、确保通信过程的保密性
利用对称加密的方法
发送方Alice生成一个临时的对称密钥,并使用这个对称密钥加密整段数据。
3、验证数据的发送方和接收方是否本人
利用公钥加密的机制:公钥加密,私钥解密;私钥加密,公钥解密。
在Alice发送时数据时用Bob公开的公钥加密数据包。在Alice接受到数据包以后用自己的私钥是否能打开,从而验证了身份。
加密和发送过程:
1、当发送方Alice有数据要发送给Bob时,为了确保数据能够完整地发送至Bob,首先需要使用单向加密算法去计算出这段要发送的数据的特征码;
2、为了便于Bob收到数据之后可验证身份,发送方Alice使用本地私钥加密这段特征码,并将加密后的特征码附加在数据后面;
3、为了确保通信过程是保密的,发送方Alice生成一个临时的对称密钥,并使用这个对称密钥加密整段数据;
4、发送方Alice获取Bob的公钥,再使用Bob的公钥加密来加密刚才生成的临时的对称密钥,并把加密后的对称密钥附加在整段加密数据后面,而后发送给Bob。
接收和解密过程:
接收和解密的过程和解密发送的过程刚好相反。
1、接收方Bob收到数据之后,先使用自己的私钥去解密这段加密过的对称密钥(由Alice生成);
2、接收方Bob用解密得到的对称密钥去解密整段(发送方用对称密钥)加密的内容;此时接收方Bob得到Alice发送给自己的数据和加密后的特征码;
3、接收方Bob用对方Alice的公钥去解密这段特征码,如果能解密出来,则发送方的身份得到验证(没错,就是Alice发送的);
4、接收方Bob再用同样的单向加密算法去计算这段数据的特征码,与解密得到的特征码进行比较,如果相同,则数据完整性得到验证,否则说明数据有可能被篡改或被破坏。
图解加密通信过程:
相关问题:
(1)什么是数字签名?
数字签名就是对数据的特征码进行加密。
(2)如何保证公钥不被篡改?
解决方法:将公钥放在证书中。只要证书是可信的,那么公钥就是可信的。
(3)公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),双方都生成一个临时的“会话密钥”(session key),用来加密信息。由于“会话密钥”是对称加密,因此运算速度快,比公钥加密快3个数量级,而公钥加密本身只用于加密“会话密钥”本身,这样就减少了耗用的时间。
七、数字证书授权机构--CA
前面的加密通信过程中能够保证通信过程的保密性、通信数据的完整性,但这是以双方(Alice和Bob)能够在此之前可靠地获取对方的公钥为前提的。如果不能保证能够可靠获取对方公钥,那么就有可能出现中间人攻击(Man-in-the-middleattack,缩写:MITM)。假设这个中间人是Eve,Eve就可以分别与Alice和Bob建立联系,而这时Alice获取的是“假的”Bob公钥,而Bob获取的是“假的”Alice公钥;这时候Alice和Bob在毫不知情的情况下进行通信,但其实他们之间数据包的转发是经由Eve的,如图:
上述的通信过程中缺失的一环在于通信双方不能保证可靠地获取对方的公钥,因此,为了保证可靠地获取通信对方的公钥,于是就有了数字证书认证机构(CertificateAuthority,缩写:CA)。CA就是为了能够保证通信双方能够可靠获取对方的公钥,而特地设定的一个双方公信的第三方可信机构。
为了避免出现上述一环的缺失,Alice和Bob可向公信的CA申请有效的证书,并由CA分别颁发给Alice和Bob,其中这个证书中的信息包括了证书拥有者的名称、公钥、证书的有效期等信息,而CA还会提取证书中信息的特征码,并用CA自己的私钥进行加密,再把加密后的特征码附加在证书中最后面。此后,当双方通信时,Alice和Bob双方都把自己的证书发给对方,并都分别使用CA的公钥去解密证书中的特征码,如果能解密,则说明证书的确由他们所信任的CA机构所颁发;接着使用同样的单向加密算法去提取证书中信息的特征码,与解密出来的特征码进行比较,如果两者相同,说明证书内容完整,没有被篡改或破坏,而对方的证书中就有对方的公钥。
但这又引入了一个问题,Alice和Bob如何可靠地获取CA的呢?显然,不能基于网络通信的方式获取CA的公钥(一切基于网络的传输都是不可靠的),而应该当面交易。全球有多个CA机构,这些CA的数量是有限、基本固定的;它们彼此之间存在互信链,也就是说CA的信任关系是可以传递的。为了管理方便,全球有一个根CA,它与其他CA是从属关系。
为了解决通信主机能够可靠获取CA的公钥,CA需要自签一份证书,就是CA自签名证书,在证书信息中包括了CA的名称、CA的公钥等,通信主机(这里是Alice和Bob)需要获取CA证书,这样才能获取CA公钥以及其他的CA信息,并能通过CA证书来验证其他通信主机的证书是否可靠。CA证书的获取需要通过当面交易来实现,而微软公司直接在windows操作系统上集成了在全球具有公信力的CA证书,但在Linux中一般不内置CA证书,需要自己通过可靠手段获取。
虽然通过上述手段可以极大地保证通信过程的安全性,但仍然存在问题,例如在这整个通信过程中使用的某种算法出现漏洞依然不够安全。
八、公钥基础设施--PKI
以上述为例子,如果Alice的私钥丢失或者被窃取,则需要立即向CA机构申请吊销证书,声明证书作废,将损失将至最低;为了能够第一时间让其他人知道证书已经吊销,可以通过各种媒体来传播,例如新闻、报纸等。由此可见,CA不单要颁发证书,还需要提供证书吊销列表,公开声明有哪些证书已经吊销及不能再信任。因此,为了可以更好地管理CA,发展出了一套以CA为核心的体系--公钥基础设施(Public Key Infrastructure,缩写为:PKI)。
PKI架构主要包括以下四部分:
①签证机构:Certificate Authority,缩写为CA;负责签署证书;
②注册机构:Registration Authority,缩写为RA;负责接收签署证书的申请;
③证书吊销列表:Certificate Revocation List,缩写为CRL;负责公开所有已经吊销的证书;
④证书存取库:Certificate Repository,缩写为CR;负责将公开所有已申请的证书的相关信息;
为了统一数字证书的格式,国际电信联盟(ITU-T)制定了数字证书标准--X.509,即数字证书的格式遵循X.509标准。在X.509v3版本中,定了数字证书的结构以及认证协议标准。而由X.509v3定义的数字证书应该包括以下几个部分:
1.版本号
2.序列号(标识第几个证书)
3.签名算法
4.发行者名称(CA名称)
5.有效期限
6.主体名称
7.主体公钥
8.发行者的唯一标识
9.主体的唯一标识
10.扩展信息
11.发行者的签名(即CA对整个证书的签名;CA把以上内容进行单向加密,得到特征码;再使用CA自己的私钥对特征码进行加密,并附在证书后面,用来生成发行者数字签名)
另外需要注意的是,数字证书中的序列号、签名算法、发行者的唯一标识等信息是集成于电子芯片中的。
九、CA如何在A和B通信之间发挥作用?
基本过程:
1、首先,在A和B通信之前需要互相发送证书;
2、A和B之间协商通信过程中要使用的加密算法(对称加密、公钥加密、单向加密、密钥交换);
3、开始验证证书:
1)用CA的公钥去解密CA的签名,如果能解密,则说明证书来源可靠;
2)用同样的单向加密算法计算出证书中信息的特征码,与解密得到的特征码进行比较;如果两者相同,则说明证书完整性可靠;
3)检查证书的有效日期是否在当前时间的合理范围内;如果证书过期了则不会被认可;
4)检查证书的主体名称与期望通信的对方是否一致;如果不一致则不会被认可;
5)检查证书是否被吊销过;如果没有吊销则可使用该证书,否则证书不会被认可。
Note:在每次通信过程中,以上步骤一步也不能少;另外,A和B需要事先获取CA自签名证书,因为持有CA自签名证书是用来验证CA颁发给其他人或主机的证书的前提。
1、为什么需要SSL?
我们知道,服务程序一般都会存在bug,黑客只要找到服务程序的bug就可以基于网络进行攻击。对于这种情况,我们的服务程序逻辑要尽可能做得足够安全,但程序总会有bug,因此需要做好安全防范,解决思路是使用一个监控程序对所有的资源访问做监控,如果攻击者想做一些未经授权的资源访问,则这个监控程序自动报警。通俗地来讲,就是“一旦它把手伸到不该伸的地方就报警”,这是一种辅助机制。但这种辅助机制只能确保本地服务程序不会被违规机制所访问到,不能确保资源在网络传输过程是安全的。
在早期计算机未普及时,使用计算机网络进行通信的主机很少,网络安全不是很受到重视。而在早期设计的一些协议本身就不具备加解密功能,例如http,ftp,smtp,pop3等协议。即便后来随着互联网的发展,网络安全得到越来越多的关注,这些协议也很难在其中添加加解密功能,因为早期的很多协议已经成为了网络通信的公共功能和基础设施,一旦在这些基础协议(例如http)添加上加解密功能,则会牵一发而动全身,各个依赖于这些基础服务程序开发出来的程序势必会受到影响。
因此,网景公司为http协议研发设计了一种可被调用的功能模块,这个功能模块所处的位置在应用层和传输层之间的半层,作为公共功能库,也称为半层库。任何程序在研发时可调用这个半层库以实现加解密和密钥分发的功能,不调用则不使用。这个半层库就是SSL库。
2、SSL是什么?
SSL(Secure Sockets Layer,安全套接字层)是一种安全的加解密协议,它的实现也是需要程序(算法)来实现。ssl是一种公共功能,但ssl本身只是一种规范和协议,需要程序员开发出一种遵循SSL协议规范的程序来实现。对于其他协议和程序也一样,
例如:httpd、nginx是http协议的服务端程序实现,而各种浏览器如IE、chrome及firefox等则是http协议的客户端程序实现;在Windows界面上的远程终端程序Xshell、在Linux上的ssh程序也是ssh协议的客户端程序实现。而ssl在Linux上的开源实现有Openssl和GPG,其中Openssl是ssl协议和ssl库的实现,而GPG是pgp协议的实现,Openssl和GPG也是密钥算法和协议的实现。
任何一个加密解密库(例如ssl库)要求必须满足以下两个功能:
①实现加解密的基本功能;
②能够基于网络通信方式实现密钥分发。
3、SSL的应用
以https通信过程为例描述SSL的实现过程:
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。
以https为例,进一步说明如何依靠CA来可靠的获得通信对方的公钥,如图:
https的主要实现过程说明:
(1)在通信之前,服务器端通过加密算法生成一对密钥,并把其公钥发给CA申请数字证书,CA审核后,结合服务端发来的相关信息生成数字证书,并把该数字证书发回给服务器端。
(2)客户端和服务器端经tcp三次握手,建立初步连接。
(3)客户端发送http报文请求并协商使用哪种加密算法。
(4)服务端响应报文并把自身的数字签名发给服务端。
(5)客服端下载CA的公钥,验证其数字证书的拥有者是否是服务器端(这个过程可以得到服务器端的公钥)。(一般是客户端验证服务端的身份,服务端不用验证客户端的身份。)
(6)如果验证通过,客户端生成一个随机对称密钥,用该密钥加密要发送的URL链接申请,再用服务器端的公钥加密该密钥,把加密的密钥和加密的URL链接一起发送到服务器。
(7)服务器端使用自身的私钥解密,获得一个对称密钥,再用该对称密钥解密经加密的URL链接,获得URL链接申请。
(8)服务器端根据获得的URL链接取得该链接的网页,并用客户端发来的对称密钥把该网页加密后发给客户端。
(9)客户端收到加密的网页,用自身的对称密钥解密,就能获得网页的内容了。
(10)TCP四次挥手,通信结束。
————————————————
版权声明:本文为CSDN博主「Skyler1996」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22030347/article/details/69573207