
网络数据传输安全概述
我们说的数据加密与解密通常是为了保证数据在网络传输过程中的安全性。在网络发展初期,网络的数据安全性是没有被足够的重视的。事实上,当时为了实现数据可以通过网络进行传输已经耗费了科学家大部分男细胞,因此在TCP/IP协议设计的初期,他们也实在没有太多精力去过多考虑数据在网络传输过程中可能存在的安全性问题。随着TCP/IP协议及相关技术的日渐成熟,网络数据传输技术越来越稳定,人们才慢慢开始重视这个问题,美国国家标准与技术研究院(National Institue of Standard and Technology,简称NIST)也开始制定相关的安全标准。
网络安全涉及到很多个方面,我们这里仅仅讨论下网络数据传输过程中可能受到的威胁,其中常见的有:
数据窃听
数据篡改
身份伪装
针对以上威胁,我们介绍下网络数据传输的安全性涉及的几个方面:
1. 机密性
机密性是指对要传输的数据进行加密和解密,防止第三方看到通信数据的明文内容。其对应的通信过程如下:
数据发送方:
plaintext(明文) ==> 转换算法 ==> ciphertext(密文)
数据接收方:
ciphertext(密文) ==> 转换算法 ==> plaintext(明文)
2. 完整性
数据完整性是指不允许数据在传输过程中被修改(第三方恶意篡改或电平信号造成的部分数据丢失),但是它不要求数据的机密性,也就是说允许其他人看到明文数据。我们通常通过以不可逆的算法对数据提取特征码(也叫数据指纹),通过验证特征码的一致性来判断数据是否被修改过,通信过程如下:
数据发送发:
plaintext(明文) ==> 转换算法 ==> plaintext(明文) + footprint(数据指纹A)
数据接收方:
plaintext(明文) + footprint(数据指纹A) ==> 转换算法 ==> footprint(数据指纹B) ==> 对比数据指纹A与B是否一致
3. 身份验证
身份验证通常是指数据接收方需要确认发送数据给自己的数据是自己想要通信的那一方,防止他人冒充通信对方的身份进行通信。身份验证的大体原理是:数据发送方与数据接收方约定一种特殊的数据加解密方式,数据发送方将一个通过约定的加密方式进行加密后的数据发送给数据接收方,数据接收方如能按照约定的加密方式正确解密该数据就表示对数据发送方的身份验证成功。其对应的通信过程如下:
数据发送方:
plaintext(明文) ==> 转换算法 ==> ciphertext(密文)
数据接收方:
ciphertext(密文) ==> 转换算法 ==> plaintext(明文)
二、数据加密算法分类
上面提到的网络数据传输所涉及到的几个方面都需要特定的转换算法来实现,常用的转换算法(数据加密/解密算法)大体上可以分为以下几类:
1. 对称加密
对称加密是指数据加密与解密使用相同的密钥。
主要功能:
通常用于保证数据的机密性。
常用的算法实现:
DES: Data Encryption Standard,秘钥长度为56位,2003年左右被破解--秘钥可以暴力破解。
3DES: DES的改进版本。
AES: Advanced Encryption Standard,支持的秘钥长度包括 128bits,192bits,258bits,384bits,512bits。
需要说明的是,秘钥长度越长,数据加密与解密的时间就越久。
特点:
加密与解密使用的密钥相同。
在一定程度上实现了数据的机密性,且简单、快速。
但是由于算法一般都是公开的,因此机密性几乎完全依赖于密钥。
同一发送方与不同接收方进行通信时应使用不同的密钥,防止数据被窃听或拦截后被解密。
存在的问题:
当通信对象很多时会面临众多秘钥的有效管理问题。
对于一个新的数据通信对象,密钥怎样进行传输的问题。
2. 单向加密
单向加密是指只能对明文数据进行加密,而不能解密数据。
主要功能:
通常用于保证数据的完整性。
常用的算法实现:
MD5: 128bits
SHA: SHA1(160bits), SHA224, SHA256, SHA384
特点:
不可逆:无法根据数据指纹/特征码还原原来的数据。
输入相同,输出必然相同。
雪崩效应:输入的微小改变,将会引起结果的巨大改变。
定长输出:无论原始数据有多长,结果的长度是相同的。
存在的问题:
可能出现中间人攻击,中间人可以对原始内容进行修改之后重新生成数据指纹,数据接收方验证数据指纹时会发现数据是正常的。此时,数据发送方只能把生成的数据指纹进行加密后再发送给数据接收方,那么问题就又回到了加密密钥的传输和管理上。
3. 公钥加密(也叫非对称加密)
公钥加密,也被称作非对称加密,也就是说加密和解密所使用的密钥是不同的。
主要作用:
通常用于保证身份验证。
常用的公钥加密算法有:
RSA: 可以实现数字签名 和 数据加密
DSA: 只能实现数字签名,不能实现数据加密
特点:
加密与解密使用的不同的密钥。
实际上它所使用的密钥是一对儿,一个交公钥,一个叫私钥。这对密钥不是独立的,公钥是从私钥中提炼出来,因此私钥是很长的,968位、1024位、2048位、4096位的都有。
通常公钥是公开的,所有人都可以得到;私钥是不能公开的,只有自己才有。
用公钥机密的内容只能用与之对应的私钥才能解密,反之亦然,这个特点尤为重要。
我们发现公钥加密“貌似”已经解决了密钥管理的问题--所有人只需要知道自己的那一对儿密钥即可,需要跟谁通信就去获取对方的公钥,然后通过这个公钥对数据进行加密和机密就可以了。我们可以用它来完成以下两件事情:
用自己的私钥加密, 可以保证身份验证,因为用你的私钥加密的数据只能用你的公开的公钥才能解密数据;但是不能保证数据的机密性,因为所有人都知道你的公钥。浏览器检查CA证书合法性时,验证CA机构的数字签名时就是通过这种方式进行的。
用对方的公钥加密, 可以保证数据的机密性,因为只有用对方的私钥才能解密,而对方的私钥只有他一个人有。HTTPS通信时,通过密钥协商技术得到的密钥进行传输时就是通过这种方式来保证机密性的。其实用对方公钥加密也可以用于用于身份验证,验证过程是:A用B的公钥加密数据后将密文传输给B,B用自己的私钥进行解密并将明文发送回给A,A对比B返回的明文和自己加密前的明文一致则表示对B完成了身份验证,通过SSH进行免密钥登录时就是通过这种方式来完成用户身份验证的。
事实上,公钥加密算法很少用于数据加密,它通常只是用来做身份认证,因为它的密钥太长,加密速度太慢--公钥加密算法的速度甚至比对称加密算法的速度慢上3个数量级(1000倍)。
存在的问题:
既然公钥加密通常只用于身份验证,而不是用于保证数据的机密性,也就意味着这个密钥对儿并不能完全作为加密和解密数据的秘钥来用。那么,秘钥的管理和传输问题依然存在着,这个问题到底怎样来解决呢?
另外还有个问题就是,如果有人伪造了一对儿密钥,把其中的公钥发送给别人怎么办?怎样验证以获取公钥的合法性呢?
密钥管理的解决方案:
实际上,已经存在一种专门用于秘钥交换的算法--Diffie-Hellman加密算法。该加密算法本身仅限于秘钥的交换用途,被许多商用产品用作秘钥交换技术。这种秘钥交换技术的目的在于使得两个用户安全的交换一个密钥,以便用于之后的数据对称加密。也就是说,通信双方可以通过这个技术,动态的协商生成一个用于对称加密的密钥,而不用管理很多静态的密钥,这样就解决了密钥的管理问题。
需要说明的是,在通过秘钥交互技术动态协商生成密钥之前,通常需要先通过公钥加密算法对对方的身份进行验证。实际上,https就是这样工作的。
防止公钥被伪造的解决方案
公钥实际上也是一段文本,验证公钥的合法性涉及到两个方面:
1)该公钥的发布者身份是否合法
2)该公钥的内容是否被篡改过
其实,这个已经不是靠纯技术能解决的问题了,这需要借助一些机构和人为约定来解决。常见的解决方案有两种:
1)公钥的合法拥有者,通过官方渠道声明其密钥的数据指纹: 既然时官方发布的信息,那么身份的合法性是有保证的;用户在获取公钥后也生成一个数据指纹,通过对比这两个数据指纹就知道公钥内容是否被修改过;SSH的身份验证实际上就是这个原理。
2)通过一些权威的机构来完成这些验证: 比如https使用的证书就是由CA机构签发的,这个在后面讲https原理时再做具体介绍。
我们常见的对于上面这些加密算法的经典应用就是ssh和https了,它们都是使用这些加密算法实现的网络协议。下面我们对ssh和https的工作原理进行下介绍,一方面当做上面这些加密算法的实例讲解,帮助大家了解这些算法的经典应用;另一方面,也帮助大家更深入的理解ssh和https是什么,以及它们是怎样工作的。

