细聊数据加密算法:对称加密和非对称加密

分享于:2019-01-30 11:28:11

网络数据传输安全概述:


我们说的数据加密与解密通常是为了保证数据在网络传输过程中的安全性。在网络发展初期,网络的数据安全性是没有被足够的重视的。事实上,当时为了实现数据可以通过网络进行传输已经耗费了科学家大部分脑细胞,因此在TCP/IP协议设计的初期,他们也实在没有太多精力去过多考虑数据在网络传输过程中可能存在的安全性问题。随着TCP/IP协议及相关技术的日渐成熟,网络数据传输技术越来越稳定,人们才慢慢开始重视这个问题,美国国家标准与技术研究院(National Institue of Standard and Technology,简称NIST)也开始制定相关的安全标准。


网络安全涉及到很多个方面,我们这里仅仅讨论下网络数据传输过程中可能受到的威胁,其中常见的有:

1)数据窃听

2)数据篡改

3)身份伪装

针对以上威胁,我们介绍下网络数据传输的安全性涉及的几个方面:


1、机密性


机密性是指对要传输的数据进行加密和解密,防止第三方看到通信数据的明文内容。其对应的通信过程如下:


数据发送方:

plaintext(明文) ==> 转换算法 ==> ciphertext(密文)


数据接收方:

ciphertext(密文) ==> 转换算法 ==> plaintext(明文)


2、完整性


数据完整性是指不允许数据在传输过程中被修改(第三方恶意篡改或电平信号造成的部分数据丢失),但是它不要求数据的机密性,也就是说允许其他人看到明文数据。我们通常通过以不可逆的算法对数据提取特征码(也叫数据指纹),通过验证特征码的一致性来判断数据是否被修改过,通信过程如下:


数据发送发:

plaintext(明文) ==> 转换算法 ==> plaintext(明文) + footprint(数据指纹A)


数据接收方:

plaintext(明文) + footprint(数据指纹A) ==> 转换算法 ==> footprint(数据指纹B) ==> 对比数据指纹A与B是否一致


3、身份验证


身份验证通常是指数据接收方需要确认发送数据给自己的数据是自己想要通信的那一方,防止他人冒充通信对方的身份进行通信。身份验证的大体原理是:数据发送方与数据接收方约定一种特殊的数据加解密方式,数据发送方将一个通过约定的加密方式进行加密后的数据发送给数据接收方,数据接收方如能按照约定的加密方式正确解密该数据就表示对数据发送方的身份验证成功。其对应的通信过程如下:


数据发送方:

plaintext(明文) ==> 转换算法 ==> ciphertext(密文)


数据接收方:

ciphertext(密文) ==> 转换算法 ==> plaintext(明文)


数据加密算法分类:


对数据进行加密。从可以解密的角度出发,加密的方式主要有两种:

  1. 对称加密(也称为秘钥加密,如果后面提到“秘钥”而不是“密钥”,你就想到是对称加密就行)

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


对称加密:


在对称加密中,客户端和服务端使用同一个密钥对数据进行加密和解密。如图所示:


客户端:

1.png


服务端:

1.png


对称加密的加密强度高,难破解,且简单快速。但是在实际应用过程中不得不面临一个棘手的问题:


如何安全地保存密钥呢?


尤其是考虑到数量庞大的Client端,很难保证密钥不被泄露。一旦一个Client端的密钥被窃据,那么整个系统的安全性也就不复存在。对于一个新的Client端,密钥怎样进行传输也是个问题。


为了解决这个问题,非对称加密应运而生。


非对称加密:


非对称加密有两个密钥:“公钥”“私钥”这两个密钥配对产生和使用。用公钥加密的数据,必须用与其对应的私钥才能解开。并且,私钥无法通过公钥获取。因此,公钥是可以被公开的,而私钥则必须被安全存放。需要跟谁通信就去获取对方的公钥,然后通过这个公钥对数据进行加密和解密就可以了。


如果对公钥和私钥不太理解,可以想象成“一个锁头”(也可以想象成多个锁头)和“一把钥匙”(钥匙必须只有一人持有),持钥匙人可以把锁头给其他人,其他人用锁把重要的东西锁起来,然后发给持钥匙人,因为只有持钥匙人有这把钥匙,所以只有他能看到被锁锁起来的东西。


如图所示:


1.png


1)远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。

2)Client使用这个公钥,将密码进行加密。

3)Client将加密的密码发送给Server端。

4)远程Server用自己的私钥,解密登录密码,然后验证其合法性。

5)若验证结果,给Client相应的响应。


注意:


“私钥”、“公钥”这两个密钥有服务端配对产生“私钥”解密“公钥”

私钥是私密的,不对外公开的,需服务端持有。公钥是可以公开的,有服务端发给客户端


私钥是Server端独有,这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。


缺点:


非对称加密的计算量开销比较大,因为它的密钥太长,加密速度太慢。非对称加密算法的速度甚至比对称加密算法的速度慢上3个数量级(1000倍)。所以说,非对称加密算法很少用于数据加密,它通常只是用来做身份认证,加密“对称加密”的秘钥


非对称加密与对称加密的“合作”:


非对称加密算法不用于数据加密,而对称加密算法算得快,多用于数据加密。好多加密协议都是两种加密算法合在一块用。两种加密算法是怎么一种“合作方式”呢?


大致是这样的:


客户端与服务端交互,需要通过对称加密算法对后面来来回回的“交流”进行加密,对称加密首先双方得有一个相同的秘钥。而这个秘钥的生成,并让双方持有不被外界知道就是借助非对称加密算法协助完成,当客户端与服务端有了这个秘钥,后面的一切数据交流就靠这个秘钥加密、解密完成。


至于这个秘钥是怎么生成?可以是持有公钥的一方单独生成,也有可能是双方通过某种协商技术共同生成,不管怎样使用非对称加密可以让双方安全地持有一个相同的秘钥。一旦双方的会话秘钥协商完成,后续的加密都将采用对称加密来进行。


非对称加密公钥被伪造:


关于非对称加密有一个问题:Client端如何保证接受到的公钥就是目标Server端的?,如果一个攻击者中途拦截Client的登录请求,向其发送自己的公钥,Client端用攻击者的公钥进行数据加密。攻击者接收到加密信息后再用自己的私钥进行解密,不就窃取了Client的登录信息了吗?这就是所谓的中间人攻击(Man-in-the-middle attack)。


1.png


公钥实际上也是一段文本,验证公钥的合法性涉及到两个方面:


1)该公钥的发布者身份是否合法

2)该公钥的内容是否被篡改过


其实,这个已经不是靠纯技术能解决的问题了,这需要借助一些机构和人为约定来解决。常见的解决方案有两种:


1)公钥的合法拥有者,通过官方渠道声明其密钥的数据指纹: 既然是官方发布的信息,那么身份的合法性是有保证的;用户在获取公钥后也生成一个数据指纹,通过对比这两个数据指纹就知道公钥内容是否被修改过;SSH的身份验证实际上就是这个原理。


2)通过一些权威的机构来完成这些验证: 比如https使用的证书就是由CA机构签发的,详情查看《https原理》。


非对称加密也可以私钥加密公钥解密


非对称家加密也可以私钥加密,公钥解密。


用自己的私钥加密, 可以保证身份验证,因为用你的私钥加密的数据只能用你的公开的公钥才能解密数据;但是不能保证数据的机密性,因为所有人都知道你的公钥。浏览器检查CA证书合法性时,验证CA机构的数字签名时就是通过这种方式进行的。


我们常见的对于上面这两种加密算法的经典应用就是ssh和https了,它们都是使用这两种加密算法实现的网络协议。对ssh和https的工作原理楠神做了分开介绍:《https原理》、《ssh原理

一方面当做上面这些加密算法的实例讲解,帮助大家了解这些算法的经典应用;另一方面,也帮助大家更深入的理解ssh和https是什么,以及它们是怎样工作的。


附:


对称加密算法实现:


DES: Data Encryption Standard,秘钥长度为56位,2003年左右被破解--秘钥可以暴力破解。

3DES: DES的改进版本。

AES: Advanced Encryption Standard,支持的秘钥长度包括 128bits,192bits,258bits,384bits,512bits。

需要说明的是,秘钥长度越长,数据加密与解密的时间就越久。


非对称加密算法实现:


RSA: 可以实现数字签名 和 数据加密

DSA: 只能实现数字签名,不能实现数据加密


单向加密(hash算法):


只能对明文数据进行加密,而不能解密数据。

主要功能:

通常用于保证数据的完整性。

常用的算法实现:

MD5: 128bits

SHA: SHA1(160bits), SHA224, SHA256, SHA384

特点:

不可逆:无法根据数据指纹/特征码还原原来的数据。

输入相同,输出必然相同。

雪崩效应:输入的微小改变,将会引起结果的巨大改变。

定长输出:无论原始数据有多长,结果的长度是相同的。