《计算机网络自顶向下方法-第七版》第七章总结

1. What Is Network Security

如果想要做到安全地通信,需要满足以下三点要求:

  • Confidentiality:因为通信过程中传输的内容可能被第三方窃听,因此需要对信息进行加密,从而即使信息被截取,也无法被破译
  • Message Integrity:在传输过程中,信息的内容可能发生改变,不管是偶然的还是恶意的,因此需要保证传输过程中信息的完整性
  • End-point authentication:通信过程中,通信双方需要确定对方的确是它真正的通信人,防止攻击者恶意冒充

对于一个攻击者来说,他具有的能力包括:

  • 监听并且记录在信道中传输的控制和数据信息
  • 修改、插入或者删除信息或者信息的内容

因此,利用这些能力,他能够对通信进行监听(窃取密码及信息),冒充通信方,劫持正在进行的对话,通过占用大量系统资源使得系统无法为合法的用户提供服务

2. Principles of Cryptography

 因为加密算法都是标准,公开的,为了防止攻击者破解加密的信息,因此需要增加一个额外的秘密信息,即Secret Key。假设被加密的信息为m,Secret Key为KA,则被加密的信息为KA(m):函数为加密算法,两个输入为m和KA。

同样,解密者手中同样有一个Secret Key,即KA,则解密过程为KB(KA(m)) - > m:函数为解密算法,两个输入为KB和KA(m)。

加密系统分为Symmetric Key Systems和Public Key Systems。

对于Symmetric Key Systems,解密方和加密方使用同样的Secret Key,即KA = KB。

对于Public Key Systems,KA != KB,解密方和加密方分别拥有Private Key(仅一人拥有)和Public Key(任何人都能知道)。既可以用Private Key进行加密,也可以用Public Key进行加密,之后使用另一种Secret Key进行解密即可。

2.1 Symmetric Key Cryptography

现在的对称加密算法分为两类:Stream Ciphers以及Block Ciphers。所谓的Block Ciphers即将数据以K个bits为单位进行加密,事实上就是将K个bits的所有01排列进行映射。一般K为64,但是如果将映射表直接存放置内存中是不可行的。因此,一般将64个bits拆分为8组8个bits,每组bits根据直接进行映射,然后将得到的结果打乱排序,再重复上述加密步骤。从而在保证加密效果的同时,降低存储成本。之所以要将每轮加密的结果打乱排序并且重复多轮,目的在于让原文中的每个bit都能在最后的加密结果中产生尽量多的影响。

相同的原文,利用加密算法得到的密文也将是完全一致的,这很容易成为攻击者进行攻击的突破口。因此,将原文拆分后的Block为B1,B2,B3...,引入随机块R,利用异或运算的性质,第一个发送的块为C1 = KS(B1异或R),第二个发送的块为C2 = KS(B2异或C1),第三个发送的块为C3 = KS(B3异或C2)...,当然最开始也要发送R,明文即可,因为攻击者并不知道加密密钥。最后,接收方可以通过B1 = KS(C1)异或R,B2 = KS(C2)异或C1...,依次进行解密。该方法称为Cipher Block Chaining(CBC)。初始的随机块R称为Initialization Vector(IV)。通过此种方法,仅仅只需一个随机数以及一系列的异或运算,就能让同样的原文生成不一样的密文,增加攻击难度。

2.2 Public Key Encryption

对称加密算法的加密方和解密方公用一个加密秘钥,但是一般情况下,如何安全地传输加密秘钥?这实际上是一个悖论。Public Key Encryption就是用于解决该问题。事实上,它不仅能用于加密数据,在authentication以及digital signatures中也有应用。

当Alice需要和Bob进行通信时,Bob首先会创建一对Public Key和Private Key,Private Key是Bob私有的,而Public Key可以为任何人所知。因此Alice先要获取Bob的Public Key,用该Key以及公开的加密算法对信息进行加密并传输。当Bob收到来自Alice的加密信息之后,利用公开的解密算法以及Private Key对加密信息进行解密,从而安全地获取到原数据。但是由于Bob的Public Key是公开的,因此任何人都能将数据加密发送给Bob,Bob也无法确定与其通信的是否真是他想要通信的人(在对称加密中,如果对方能用约定的秘钥进行加密,则默认对方的身份是真实的),此时需要引入数字签名。

RSA加密的本质是将要传输的数据用一个整数进行表示并将该整数进行加密。RSA首先要选择两个足够大的素数p和q,再进行一系列复杂的计算得到Public Key和Private Key。RSA之所以安全是因为目前没有方法能够快速地将n分解为素数p和q,因此它的安全性也并不是完全有保证的。

非对称加密,例如RSA是非常耗时的,如果每次通信都用RSA加密,将极大地增加通信延时。因此,一般都利用RSA来传递对称加密的秘钥(Session Key),之后进行对称加密通信。

3. Message Integrity and Digital Signatures

所谓的Message Integrity是指,当Bob收到Alice发送的信息时,他需要确保信息的确是Alice发出的并且信息在传输过程中没有被修改。

哈希函数能够将任意长度的输入信息转换为唯一的,固定长度的输出,常用的哈希函数有MD5和SHA-1。因此,对于要传输的信息m,其哈希值为H(m),则只要传输(m, H(m))即可保证m在传输过程中不被修改。但是这并不能保证数据传输者的真实性。因此,当Alice和Bob需要通信时,两者需要共享一个Authentication Key -> s,且传输的内容变为(m, H(m + s)),其中H(m + s)称为Message Authentication Key(MAC)。值得注意的是,这一过程无需进行加密。当然,若Bob要确定与它交互的的确是Alice,它需要事先使用非对称加密将Authentication Key传输给Alice(?)。

3.3 Digital Signatures

 Digital Signatures用于表示某个信息的确由某人发出,因此Digital Signatures必须是可以验证的且不可伪造的。事实上,利用Public Key Encryption即可做到这一点。因为Private Key仅有生成Key Pair的人才拥有,因此可以验证其身份。而为了节省加密过程的计算量,可以先用哈希函数将需要加密的文章进行压缩。因此,若Bob想要向Alice发送信息m,他可以对m运行哈希函数H(m),再用Private Key对H(m)进行加密,当Alice用Bob的Pulic Key解密获得H(m),与m进行哈希获得对值进行比较,若两者相等,则既能保证信息对完整,又能保证其由Bob发出。

但是如果保证Alice手中对Pulic Key的确就是Bod的呢?此时需要一个权威的机构为某个Pulic Key背书,这样的权威机构叫做Certification Authority(CA),它会对某个通信实体进行验证并为其颁发Certificate,Certificate中包含了该通信实体的Public Key以及Pulic Key Owner的相关信息,而证书的内容也会用CA的Private Key进行加密和签名。当Bob需要和Alice进行通信时,Bob会给她发送一个由CA签名的证书,Alice会用CA的Public Key对Bob的省份进行验证并从中抽取出Bob的Public Key。

4. End-Point Authentication

End-Point Authentication是一个通信实体通过计算机网络向另一个通信实体证明其身份的过程。直观的想法是通过加密的账号密码即可进行身份的验证,但是这种方法会遭到Playback Attack的攻击。攻击者只要重放加密的账号密码即可绕过身份验证。为了避免该攻击,需要引入Nonce,来保证验证的即时性。例如Alice想要和Bob进行通信,Alice发送"I'm Alice"给Bob,Bob选取一个Nonce R(一般应该是时间戳)发送给Alice,Alice用两者都知道的对称加密算法对R进行加密并发送给Bob,Bob进行解密并校验R,由此来即使验证Alice。准确地说,此处两者共知的加密秘钥是用来验证Alice身份的,而Nonce是用于保证通讯的即时性。

5. Securing TCP Connections: SSL

Secure Sockets Layer(SSL)用于为TCP提供安全保障,可应用于任何运行在TCP之上的应用,但用在基于HTTP协议的应用较多。SSL为开发者提供了和TCP相似的Socket API,因此用户可以简单透明地对其进行使用。SSL版本3经过简单修改之后称为Transport Layer Security(TLS)。

SSL一般可分为三个阶段:Handshake,Key Derivation以及Data Transfer

因为SSL需要对数据进行加密,而TCP是数据流,因此需要将TCP数据切割为SSL Record,每个SSL Record从头部开始依次包括:Type,Version,Length,Data以及MAC,其中前三个字段不加密,Type字段表明该Record是一个Handshake Message还是包含应用数据的Message。

真实的SSL Handshake步骤如下:

  1. Client将支持的一系列加密算法以及Client Nonce发送至Server
  2. 从算法列表中,Server选取一个Symmetric Algorithm,一个Public Key Algorithm以及一个MAC Algorithm并将它的选择连同Certificate和Server Nonce发送至Client
  3. Client对Certificate进行验证,获取Server的Public Key,生成一个Pre-Master Secret(PMS),并用Server的Public Key对PMS进行加密并发送至Server
  4. 根据SSL标准的规定,Client和Server用同样的Key Derivation Function,根据PMS和Nonce计算出Master Secret(MS),再用MS生成两个加密数据的Secret和Mac Keys。如果选择的对称加密算法为CBC,则再基于MS创建IV
  5. Client发送所有Handshake Messages的MAC
  6. Server发送所有Handshake Messages的MAC

之所以需要步骤5和6是因为在步骤1和2选择加密算法的交互信息是未加密的,攻击者可以从中剔除强度较高的加密算法,步骤5和6确保通信双发接收到的都是未经修改的数据。

事实上每个SSL Record的MAC包含的DATA(DATA应该包含Type,Version和Length?) + Seq Number + AC的哈希值,Seq Number用于防止SSL Record的Replay,而在Handshake中Client和Server的Nonce则是用于Connection Replay,防止攻击者利用截取的数据建立重复的连接。

当需要关闭SSL时,不能直接发送TCP FIN,而是应该先发送一个Closure SSL Record,虽然Record的Type是明文的,但是有Record的MAC用于验证。

 

posted on 2019-02-22 10:54  姚灯灯!  阅读(332)  评论(0编辑  收藏

导航