首页 » PHP和MySQL Web开发(原书第4版) » PHP和MySQL Web开发(原书第4版)全文在线阅读

《PHP和MySQL Web开发(原书第4版)》18.2 使用加密套接字层(SSL)

关灯直达底部

Secure Sockets Layer Protocol(SSL协议)最初是由Netscape公司提出来的,它是为了实现Web服务器和Web浏览器之间的安全通信而设计的。自从被采纳以来,已经成为浏览器与服务器之间交换重要信息的非正式标准方式。

SSL 2和3版本都得到了广泛的支持。大多数Web服务器都包含SSL功能,或者作为插件模块的方式接受它。Internet Explorer和Firefox都支持SSL 3及其以后的版本。

通常,实现SSL的网络协议和软件都是按照一种层次堆栈的形式来组织的。每一层能够将数据传输到上一层或下一层,并且能够向上一层和下一层发出服务请求。图18-2所示的就是这种堆栈式的协议。

图 18-2 应用层协议(例如,超文本传输协议)使用的协议堆栈

当使用HTTP传输信息时,HTTP协议将调用传输控制协议(TCP)层,而传输控制协议又依赖于Internet协议(IP)层。该协议又需要一个适用于网络硬件的协议。这种协议用于将数据打包并以电子信号方式把它们传输到目的地。

HTTP被应用层协议调用。有许多其他不同的应用层协议,例如FTP、SMTP和Telnet(如图18-2所示),以及其他协议如POP和IMAP。TCP是在TCP/IP网络中使用的两种传输层协议中的一种。IP是网络层的协议。网络层的主机负责将我们的主机(计算机)连接到一个网络。TCP/IP协议堆栈没有详细说明应用于这一层的协议,因为对于不同类型的网络需要使用不同的协议。

在发送数据时,数据将通过堆栈从应用层发送到物理层网络媒介。一旦接收到数据,数据将通过堆栈从物理层传输到应用层,直到应用程序。

使用SSL将为这种模型添加一个额外的透明层。SSL层介于传输层和应用层之间,如图18-3所示。在将信息发送到传输层以将其送到目的地之前,SSL层修改来自HTTP应用层的数据。

图 18-3 SSL在协议堆栈中添加了一个附加层,与应用层一样控制自己的操作

SSL除了为HTTP提供安全传输环境以外,还能为其他协议提供安全传输环境。因为SSL层实质上是透明的,所以也可以使用其他协议。SSL层为下面的传输层提供接口,同样也为上面的应用层提供接口。SSL可以透明地处理握手、加密和解密。

当一个Web浏览器通过HTTP连接到一个安全的Web服务器时,两者需要通过一个握手协议来达成一些共识,例如,身份验证和加密。

握手序列包括下列步骤:

1)浏览器连接到一个启用了SSL的服务器并要求服务器验证自己。

2)服务器发送数字证书。

3)服务器有时可能(这种情况很少出现)要求浏览器证明其自身。

4)浏览器列出一组加密算法和它支持的哈希函数。服务器选择它所支持的功能最强大的加密算法。

5)浏览器和服务器生成会话密钥:

a)浏览器从数字证书上获得服务器的公有密钥,并使用该公有密钥加密一个随机生成的数字。

b)服务器对以简单文本形式发送的随机数据做出响应(除非浏览器已经为服务器的验证请求提供了数字证书,在这种情况下,服务器将使用浏览器的公有密钥)。

c)用于会话的加密密钥通过使用哈希函数从随机数中产生。

生成高质量的随机数、解密数字证书、生成密钥,以及使用公有密钥加密系统都需要花费时间,因此这种握手过程也需要花费时间。幸运的是,结果将被缓存起来。如果同样的浏览器和服务器需要多次交换安全信息,握手过程发生一次,处理时间也只有一次。

当数据通过SSL连接发送时,将遵循下列步骤:

1)将数据分成易管理的数据包。

2)压缩每个数据包(可选的)。

3)每个数据包有一个信息验证码(MAC),信息验证码是通过哈希算法计算出来的。

4)将MAC和压缩的数据包组合到一起并加密它们。

5)加密后的数据与头信息组合在一起并被发送到网络中。

完整的过程如图18-4所示。

图 18-4 发送数据之前,SSL将分解、压缩、哈希计算和加密数据

从上图中,我们会注意到,TCP的头信息是在数据加密之后才加入的。这就意味着在传输途中的信息仍然潜在地可能遭到修改,尽管刺探者不能辨别我们正在交换什么信息,但是他们能够看到谁正在交换信息。

SSL在加密之前包含压缩信息的原因是:尽管在网络传输中可以(通常是)压缩大多数网络通信,但是不能很好地压缩已加密数据。压缩模式依赖于数据的重复量和模式。在数据经过加密已经变成非常随机的组合之后,试图应用一种压缩算法通常是没有意义的。如果为提高网络安全性而设计的SSL带有极大地增加网络通信量的副作用,那么这是十分不合算的。

尽管SSL相对来说比较复杂,但是由于它的外部接口模拟现存的协议,因此在大多数情况下,用户和开发者可以受到保护。

目前,TLS(Transport Layer Security,传输层加密)还只是1.1版本,它是直接基于SSL 3.0标准的,但是还包含了一些可以克服SSL 3.0缺陷的改进,同时还提供了进一步的灵活性。人们计划将TLS设计为真正的开放标准,而不是由某个组织定义然后推广到其他组织。