当谈论通讯安全的时候,通常我们关心的是下面四个问题:
1)防止消息窃听
当传送的消息是机密内容的时,人们希望给消息加密。这样即使消息在传送过程中被截获,窃听者也无法确切的知道消息内容,从而达到保密的效果。
2)防止消息篡改
消息在传送过程中,有可能被攻击者篡改内容,这样接收者接到的就是错误的信息,通讯过程中应该提供某种方案防止篡改。
3)防止消息伪造
攻击者假冒发送者的名义,给接收者发送消息,这种行为称为消息伪造。
4)防止否认
发送者事后否认自己发送过消息,需要有一种机制来防止这种情况发生。
下面,我们将详细分析下这四个问题。
1. 防窃听
提到加密,很多人的第一反应是下面这样:
“自己实现一个加密算法,然后将算法保密,这样就能保证安全。”
在密码学的领域,这是个典型的误区。
首先,开发高强度的加密算法是非常困难的。普通的算法在外行看起来牢不可破,但是专业破译者却有非常多的工具和攻击方式,使其破绽百出。
其次,加密算法的秘密总有一天会公诸于世。到那时,所有基于这个算法的秘密都将被泄露。
实践中使用的加密算法都是公开的,消息传递依靠保密的密钥来确保消息不被破解。正因此,它们经过攻击者长期尝试仍未被破解,所以保密强度较高。
常用的加密体系分为三类,对称加密、非对称加密和混合加密。
1.1 对称加密
对称加密是指加密和解密用的是同一个密钥。这个密钥只有发送者和接收者知晓,其他没有密钥的人无法解密消息。
常见的对称加密算法有 DES 、 3DES 和 AES 等。随着计算机硬件的进步,使用暴力破解法已经能在现实时间中完成对 DES 的破解; 3DES 处理速度不高,此外在安全性方面也逐渐显现出了些问题;目前应该选用的算法是 AES 。
1.2 非对称加密
与对称加密不同,非对称加密算法需要两个密钥——公钥和私钥。
公钥和私钥是一对。公钥加密,对应的私钥才能解密,反之亦然。前面的场景适用于防窃听,后面的场景适用于数字签名,也就是防止否认。
实现机密消息交换的基本过程是:甲方生成一对密钥并将其中一个作为公钥向其它方公开,得到该公钥的乙方使用该公钥对消息进行加密再发送给甲方,甲方再使用自己的私钥对消息进行解密。
网络中的其他窃听者虽然也能拿到甲方的公钥,但是加密后的消息只有私钥才能解开,所以他们无法破译消息。
最常使用的非对称加密算法是 RSA 。
1.3 混合加密
比较一下对称加密和非对称加密各自的特点:
对称加密处理速度快,但是由于通讯双方使用的是同一个密钥,存在密钥配送困难的问题。要求通讯双方线下交换密钥是不现实的,而线上配送又存在被窃听的风险。
非对称加密的公钥本身就是可以对外公开的,天然避免了密钥配送的问题;但是非对称加密的处理速度远远低于对称加密。
混合加密体系是将上述两种优势相结合的办法。
先看一下加密过程。
通讯过程中传送了两部分内容:一部分是使用对称加密算法加密的消息,另一部分是对称加密的密钥。其中对称加密的密钥是由接收方的公钥加密过的,这样除了接收方之外,任何其他人都不能解开对称加密的密钥,从而也无法解开加密的消息。
加密过程
相比于要传送的消息本身,对称密钥的长度要短得多。非对称加密的处理速度慢,所以只用来加密对称密钥,而很长的消息则用处理速度快的对称算法来加密。
下面是解密过程。
先把对称加密的密钥和加密后消息这两部分分离开。对称密钥之前是用接收者的公钥加密的,所以只能使用接收者的私钥进行解密。对称密钥解出来之后,就可以对消息密文进行解密了,从而得到消息明文。
2. 防篡改
通讯过程中,接收方有时候会有这样的疑问:
“我接收到的消息确实就是发送者发过来的那条吗?在传输的过程中会不会已经被攻击者给改写了?”
这是对消息完整性的挑战。
实践中一般使用摘要算法来应对这种挑战。
摘要算法有如下重要特性。
第一,输入任意长度的字符串,输出固定长度的字符串。比起要传输的消息长度来说,输出的固定长度通常很短,因此很容易进行处理。
第二,相同的输入总是对应相同的输出。发送方对消息进行摘要处理,同时把摘要附在消息里发送出来。接收方收到之后用同样的摘要算法对消息进行处理,再把计算出来的摘要和收到的摘要进行对比,如果不一致,就能知道消息已被篡改。
第三,给定一个字符串 A ,经过摘要算法处理后的串 B ,很难找到一个字符串 C ,使其摘要后的串和串 B 相同。这个重要的特性称为抗碰撞性(弱抗碰撞性)。这条特性使得攻击者在篡改消息后,很难再计算出同样的摘要,从而规避摘要算法的检查。
第四,这种转换具有单向性,即不能通过输出串倒推出输入串。
常用的摘要算法包含 MD4 、 MD5 、 SHA-1 和 SHA-2 (包含 SHA-256 、SHA-384 和 SHA-512 )。上述算法中目前唯有 SHA-2 算法的强抗碰撞性尚未被攻破。
3. 防伪造
防伪造指的是”消息来自正确的发送者”。
防篡改关注的是消息内容,防伪造关注的是消息发送者本身。
防篡改关注的是消息的完整性( integrity ),防伪造关注的是消息的认证( authentication )。
消息认证码( Message Authentication Code )是一种既能检查消息完整性,又能做身份验证的技术,取三个单词的首字母,简称为 MAC 。
实践中经常使用与密钥相关的摘要算法来实现消息认证码。
消息认证码的使用步骤如下:
1. 发送者和接收者事先共享密钥;
2. 发送者使用共享密钥对消息计算 MAC 值;
3. 发送者将消息和 MAC 一起发给接收者;
4. 接收者使用共享密钥对接收到的消息计算 MAC 值;
5. 接收者将计算的 MAC 值跟接收到的 MAC 值做比较;
由于攻击者没有共享密钥,所以无法跟接收者算出一样的 MAC 值。
跟对称密钥一样,这里同样面临密钥配送的问题,我们仍然可以采用非对称加密的方式进行密钥配送。除此之外, Diffie-Hellman 算法也是常用的密钥交换方式。
4. 防否认
想象一下这个场景, Bob 收到了一张 Alice 发来的五百万元的借条。使用事先约定好的共享密钥, Bob 计算出的 MAC 值跟借条里收到的 MAC 值一致,这表明消息没有被篡改,同时消息也不会是第三方伪造的,那么就没有任何后顾之忧了吗?
并不是这样。问题在于共享密钥是两个人持有的,因此能算出正确 MAC 值的并不只是 Alice , Bob 也能。如果 Alice 声称自己没有发过这样的借条,那作为第三方仲裁者来说,无法证明借条是 Alice 生成的还是 Bob 生成的。
我们需要寻求一种解决方案, Alice 使用的签名是由只有她自己才知道的密钥生成,同时别人还能顺利解开。这样别人无法伪造 Alice 的签名,同时还能验证这个签名。
看上去是不是有点熟悉?没错,就是之前介绍过的非对称加密。
Alice 使用自己的私钥对消息进行签名(加密),同时对外发布对应的公钥。无论是 Bob 还是第三方仲裁者,都可以使用公钥对签名进行验证(解密)。
这种方案称为数字签名。
5. 后话
到目前为止,看上去我们解决了之前提出的四个问题,但是通讯安全领域的问题还远不止这些。比如怎么验证公钥的可靠性?比如怎么才能生成一个可靠的随机数?再延伸下去我们会涉及到证书,认证机构和随机数的分级等领域,这里就不再一一展开了。
最后,请大家记住一句话:只有完美的密码,没有完美的人。不管多精密的系统,在确保整体安全方面,人是一个特别巨大的弱点。很多时候,最脆弱的环节并不是各种算法,而是人类自己。