我们在使用网络时(尤其是做一些隐私的事情,比方账号密码等),希望计算机网络有对应的机制能够保证:
1.机密性。即一旦通信双方的报文被窃听者截获,窃听者无法理解截获的报文。
2.报文完整性。即防止有恶意篡改我们的数据。
3.端点识别。A和B通信是需要明确在电脑前的是A和B,而不是其他人。
4.运行安全。这里主要是服务器如何应对攻击。
下面我们分别对以上几个方面进行较为深入的了解。
1.机密性
有几个术语需要先介绍下。例如A和B进行通信,A向B发送的原始报文(例如“i love you”)称为
明文,未防止第三方截获到这个重要信息需要通过加密算法进行加密,加密后的报文称为
密文(例如e joiv qvo)。可是现在这些加密算法都是已知的,只不过每次加密用到的数据编码不同,我们称这个数据编码为
密钥(可以理解为密码表)。
A提供一个密钥Ka然后用加密算法把数据加密传输给B,B用密钥Kb对加密数据进行解密然后获取报文。如果A和B使用的密钥相同而且是秘密的(仅有A和B知道,截获报文的第三方不知),那么称为
对称密钥系统。相对应的还有
公开密钥系统,在公开密钥系统中,A和B使用一对(两个)密钥,一个密钥A和B都知道(截获报文的第三方也知道),称为
公钥。而另一个密钥仅有A或B知道。A自己知道的密钥称为A的
私钥,对应的B自己知道的密钥称为B的私钥。
下面我们来看公开密钥系统是如何加密数据的。如果A要向B发送数据,那么A首先要获取B的
公钥,然后使用加密算法对明文进行加密。B收到A发送的密文后,用
B的私钥进行解密。下面介绍公开密钥系统中著名的RSA算法
RSA加密算法
密钥的生成:
1.选择两个大的素数p和q
2.计算n=pq和z=(p-1)(q-1)
3.选择一个小于n的数e使得e和z互质。
4.找整数d使得ed%z==1
5.这样公钥就是(n,e),私钥是(n,d)
加密和解密:
设明文是m,加密后的密文为c=m^e%n。收到密文后用m=c^d%n进行解密
2.报文完整性和数字签名
当B收到A发送过来的报文后,B需要确认两点:该报文确实来自A而不是冒充A的第三方,而且报文在传输途中没有被篡改。
密码散列函数
把不同长度的数据m输入,经过散列函数计算后得到相同长度的值H(m),要求是如果X≠Y,则H(X)≠H(Y)基本成立(事实上我们前面提到过的报文鉴别码就是一种密码散列函数,只不过这个散列函数太弱了)。例如MD5算法就是把输入的数据映射成一个128字节的MD5值。我们平时使用的百度云的极速秒传就是根据MD5算法计算出你要上传文件的MD5值然后和百度云服务器上的MD5值比对,如果有相同的那就说明你要上传的文件在云端已经存在了。
报文鉴别码
有了密码散列函数,我们很容易想到鉴别报文完整性的过程:
1.A将生成的报文m计算散列值H(m),然后把散列值附加到报文m上。
2.B收到A发送来的报文(m',h')后计算H(m')的值,如果H(m')==h'则B认为一切正常。
我们发现这样存在一个问题,那就是如果报文由第三方假冒则接收方并不会知道这是假冒的报文(因为B没有A生成的H(m)的一点信息,因此B无法确认收到的h'的正确性)。因此我们在报文中添加一个
鉴别密钥s,s仅有A和B知道。A的散列值由原来的H(m)变成H(m+s),这样的话即便是由第三方假冒了信息,可是它不知道鉴别密钥s的值因此B在进行确认时会察觉出数据是假冒的。H(m+s)称为
报文鉴别码。
数字签名
我们日常生活中在签协议时为了表示同意会在协议书上签下自己的名字。我们的签名有两个特点:经过比对字迹可以知道这是我签的(可证实),只有我能够签出这样的字迹(无法伪造)。在网络传输时我们也需要这种表明身份的数字签名。
显然,私钥加密可以实现数字签名的效果。但是加密的代价太大,我们采用散列函数计算散列函数来简化这一操作。即先通过散列函数计算散列值(散列函数双方已知),然后用私钥加密这个散列值。
公钥认证
这是数字签名的一个很重要的领域,即证实一个公钥属于某个实体。这将由认证中心(CA)来进行验证和绑定。一旦身份验证成功,CA会生成一个把身份和公钥绑定的
证书,这个证书包含公钥和公钥所有者的唯一身份标识信息(名字或ip地址),并由CA对证书进行数字签名。
3.端点识别
如何确定接收方接收到的来自A的数据的确是来自A而不是别人假冒的呢?这叫做鉴别协议(ap)
ap1.0: A直接向B说:我是A。这个协议太弱了,因为C也可以向B说“我是A”来冒充A。
ap2.0: B来比对接收到的IP地址是否和A的IP地址相吻合。不过我们可以直接修改网络层数据报的内容来假冒A的IP地址。
ap3.0: 除了说“我是A”之外,还需要加上一个口令(例如“芝麻开门”),这个口令是仅有A和B已知的。可是我们可以通过嗅探局域网上传输的数据分组从而窃取到A的口令,然后冒充A。
ap4.0:当B收到“我是A”之后向发送方发送一个不重数R(即每次的值都不同),发送方收到R后用他的私钥进行加密然后把密文发送给B,B解密后通过查看是否为R来判断发送方是否为A。
4.使用TCP连接安全:SSL
SSL为了使TCP的双方能够安全的建立连接在握手后增加了身份确认的阶段。