Skip to content

计算机网络中的安全

首先介绍一下 Alice 和 Bob,这俩人要进行通信,并希望通信过程是“安全”的。
Alice 和 Bob 可以是两台需要安全地交换路由选择的路由器,也可以是希望建立一个安全传输连接的客户和服务器,或是两个交换安全电子邮件的电子邮件应用程序。
总之,Alice 和 Bob 是安全领域中两个众所周知的固定设备,也许因为使用 Alice 和 Bob 更为有趣,这与命名为“A”的普通实体需要安全地与命名为“B”的普通实体进行通信的作用是一样的。
需要安全通信的例子通常包括不正当的情人关系、战时通信和商业事务往来;
我们宁愿用第一个例子而不用最后两个例子,并使用 Alice 和 Bob 作为发送方和接收方,以第一种情况为背景来讨论问题。

我们说过 Alice 和 Bob 要进行通信并希望做到“安全”,那么此处的安全其确切含义是什么呢?
如我们将看到的那样,安全性(像爱一样)是多姿多彩的;也就是说,安全性有许多方面。
毫无疑问,Alice 和 Bob 希望他们之间的通信内容对于窃听者是保密的。
他们可能也想要确保当他们进行通信时,确实是在和对方通信,还希望如果他们之间的通信被窃听者篡改,他们能够检测到该通信已被篡改破坏。

什么是网络安全

我们还是以要进行“安全”通信的情人 Alice 和 Bob 为例,开始网络安全的研究。
这确切地意味着什么呢?显然,Alice 希望即使他们在一个不安全的媒体上进行通信,也只有 Bob 能够理解她所发送的报文,其中入侵者(入侵者名叫 Trudy)能够在该媒体上截获从 Alice 向 Bob 传输的报文。
Bob 也需要确保从 Alice 接收到的报文确实是由 Alice 所发送的,并且 Alice 要确保和她进行通信的人的确就是 Bob。
Alice 和 Bob 还要确保他们报文的内容在传输过程中没有被篡改。
他们首先要确信能够通信(即无人拒绝他们接入通信所需的资源)。

密码学的原则

现在假设 Alice 要向 Bob 发送一个报文。
Alice 报文的最初形式(例如,"Bob, I love you. Alice")被称为明文(plaintext, cleartext)。
Alice 使用加密算法加密其明文报文,生成的加密报文被称为密文,该密文对任何入侵者看起来是不可懂的。
有趣的是许多现代密码系统中,包括因特网上所使用的哪些,加密技术本身是已知的,即公开发行的、标准化的和任何人都可使用的(例如[RFC 1321; RFC 3447; RFC 2420; NIST 2001]),即使对潜在的入侵者也是如此!
显然,如果任何人都知道数据编码的方法,则一定有一些秘密信息可以阻止入侵者解密被传输的数据。
这些秘密信息就是密钥

Alice 提供一个密钥(key)K_A,它是一串数字或字符,作为加密算法的输入。
加密算法以密钥的明文报文 m 为输入,生成的密文作为输出。
用符号 K_A(m) 表示(使用密钥 K_A 加密的)明文报文 m 密文形式。
使用密钥 K_A 的实际加密算法显然与上下文有关。

类似的,Bob 将为解密算法提供密钥 K_B,将密文和 Bob 的密钥作为输入,输出为初始明文。
也就是说,如果 Bob 接收到一个加密的报文 K_A(m),他可通过计算 K_B(K_A(m)) = m 进行解密。

对称密钥系统(symmetric key system)中,Alice 和 Bob 的密钥是相同的并且是秘密的。
公开密钥系统(public key system,也称为公钥系统)中,使用一对密钥:一个密钥为 Bob 和 Alice 俩人所知(实际上为全世界所知),另一个密钥只有 Bob 和 Alice 知道(而不是双方都知道)。

对称密钥密码体制

公开密钥加密

公开密钥密码的使用在概念上相当简单。
假设 Alice 和 Bob 通信。这时 Alice 和 Bob 并未共享一个密钥(如同在对称加密系统情况下),而 Bob(Alice 报文的接收方)则有两个密钥,一个是世界上任何人(包括入侵者 Trudy)都可得到的公钥(public key),另一个是只有 Bob 知道的私钥(private key)。
我们使用符号 K_B^{+}K_B^{-} 来分别表示 Bob 的公钥和私钥。
为了与 Bob 通信,Alice 首先取得 Bob 的公钥,然后用这个公钥和一个众所周知的(例如,已标准化)加密算法,加密她要传递给 Bob 的报文 m;
即 Alice 计算 K_B^{+}(m)
Bob 接收到 Alice 的加密报文后,用其私钥和一个众所周知的(例如,已标准化的)解密算法解密 Alice 的加密报文,即 Bob 计算 K_B^{-}(K_B^{+}(m))
后面我们将看到,存在着可以选择公钥和私钥的加密/解密算法和技术,使得 K_B^{-}(K_B^{+}(m)) = m
也就是说,用 Bob 的公钥 K_B^{+} 加密报文 m(得到 K_B^{+}(m)),然后再用 Bob 的私钥 K_B^{-} 解密报文的密文形式(就是计算 K_B^{-}(K_B^{+}(m))) 就能得到最初的明文 m。这是个不寻常的结果!

用这种办法,Alice 可以使用 Bob 公开可用的密钥给 Bob 发送机密信息,而他们任一方都无需分发任何密钥!

我们很快能够看到,公钥和私钥加密相互交换同样能够得到不寻常的结果,即 K_B^{-}(K_B^{+}(m)) = K_B^{+}(K_B^{-}(m)) = m

因此公开密钥密码体制的使用在概念上是简单的。但是有两点必须要注意。
首先应关注的是,尽管入侵者截取到 Alice 的加密报文时看到的只是乱码,但是入侵者知道公钥(显然 Bob 的公钥是全世界都可以使用的)和 Alice 加密所用的算法。
Trudy 可以据此发起选择明文攻击,使用已知的标准加密算法和 Bob 的公开可用的加密密钥对她所选择的任意报文编码!
例如,Trudy 可以尝试对她怀疑 Alice 可能发送的全部报文或部分报文编码。
很明显,要使公开密钥密码能工作,密钥选择和加密/解密算法必须保证任意入侵者都不能(至少要困难得几乎不可能)确定出 Bob 的私钥或者以某种方式解密或猜出 Alice 发给 Bob 的报文。
第二个值得关注的问题是,既然 Bob 的加密密钥是公开的,任何人(包括 Alice 和其他声称自己是 Alice 的人)都可能向 Bob 发送一个已加密的报文。
在单一共享密钥情况下,发送方知道共享秘密密钥的事实就已经向接收方隐含地证实了发送方的身份。
然而在公钥体制中,这点就行不通了,因为任何一个人都可向 Bob 发送使用 Bob 的公开可用密钥加密的报文。
这就需要用数字签名把发送方和报文绑定起来。

数字签名

书信或文件是根据亲笔签名或印章来证明其真实性的。
但在计算机网络中传送的文件又如何盖章呢?这就要使用数字签名
数字签名必须保证能够实现以下三点功能:

(1) 接受者能够核实发送者对报文的的签名。
也就是说,接受者能够确信该报文的确是发送者发送的。其他人无法伪造对报文的签名。这叫做报文鉴别

(2) 接受者确信所收到的数据和发送者发送的完全一样而没有被篡改过。这叫做报文的完整性

(3) 发送者事后不能抵赖对报文的签名。这叫做不可否认。

现在已有多种实现数字签名的方法。
但采用公钥算法要比采用对称密钥算法更容易实现。
下面就来介绍这种数字签名。

公钥的分配

在公钥密码体制中,如果每个用户都具有其他用户的公钥,就可实现安全通信。
看起来好像可以随意公布用户的公钥,其实不然。
设想用户 A 要欺骗用户 B,A 可以向 B 发送一份伪造是 C 发送的报文,A 用自己的死要进行数字签名,并附上 A 自己的公钥,谎称这公钥是 C 的。B 如何知道这个公钥不是 C 的呢?

为了满足网络环境陌生人之间安全通信的需求,通过可信第三方的公钥基础设施被提出来,这样,当陌生的 A 与 B 想要建立一条安全路径时,可以寻找共同信任的第三方,在可信第三方的帮助下实现 A 对 B 所拥有的公钥的鉴别,从而建立从 B 到 A 的安全通道。

简单地说,公钥基础设施就是让可信第三方对用户的公钥签署证书,只要验证公钥证书的合法性,就可以相信公钥证书中所描述的公钥属主信息。

在通信双方 A 与 B 互不信任的情况下,要想使 B 确信某个公钥的确是 A 的公钥,必须有一个 B 信得过的第三方 T 向 B 证明,而 T 又必须有能力知道该公钥的确属于 A,从而可以向 B 提供真实信息。
为了使这种证明可以离线工作,即不必要由 T 亲自向 B 证明,只要 T 预先出具一个证明,A 通过向 B 提供这个证明即可。
这种证明就是公钥证书
更确切地说,公钥证书是一个用户都信任的称为证书签署中心(CA)的第三方向每一个合法用户的公钥签署一个证书,该证书包含用户身份信息(如 IP 地址)、用户公钥信息、证书的签发时间和有效期等信息。
CA 对这些信息进行数字签名,该签名就是公钥证书。
任何人收到这样一个公钥证书后,通过验证 CA 的签名是否合法以及证书是否还有效,就可知道证书中所包含的公钥属于谁。

为了能验证 CA 的签名,用户应该知道 CA 的公钥信息。如果用户不知道 CA 的公钥,即认为这是系统外的用户,不予考虑。
系统中的用户知道 CA 的真实公钥是最基本的信任假设,缺少这个假设任何其他信任都很难建立起来。

可能还有一系列的问题,如 CA 为什么要为用户签署公钥证书?
答案很简单:CA 是服务机构,或者是盈利机构,而用户是他的客户。
CA 如何知道用户提供的公钥是真实的?这一点毋庸置疑,因为没有哪个用户用别人的公钥作为自己的去申请证书,那样只能给别人提供攻击自己的机会。
那么 CA 如何知道用户的身份是真实的?这一点需要各个 CA 去掌握。
在许多应用环境中,CA 对用户提供的身份信息需要通过另外的途径图验证,如电话确认或让用户离线注册

最后的问题是由谁来做 CA。同样的回答是看具体情况。
但不管是哪种情况,在整个世界都被 Internet 连接在一起的今天,没有谁能做全世界的 CA,因为如果存在这样一个 CA,它对用户的身份确认就是个问题,而要要服务世界范围内的用户,负担也太重,而且一旦网络出现问题或 CA 的服务器遭受攻击,所造成的损失太大。
为了解决世界范围内,或者至少在较大范围内(如一个国家)能对公钥签署证书,公钥基础设施(PKI, Public Key Infrastructure)应运而生。

PKI 是一种签署和管理公钥证书的标准体系,它看起来似乎是件容易的事,但具体成为标准的话需要考虑很多方面的问题,如证书格式、证书的撤销和更新过程、证书的存放和查询、证书的验证,特别是跨 CA 证书的验证等。