加密技术在HTTPS(SSL/TLS)中的应用

这是一个数据的时代,数据在网络传输中得安全则建立在SSL/TLS之上。本文重点讲述SSL/TLS协议之上数据传输原理,具体协议实现细节请参考RFC文档

什么是SSL/TLS

  • SSL (Secure Sockets Layer),中文翻译“安全套接层”,是90年代由NetScape设计的一种安全协议,目的是为在网络上传输的数据提供安全性与完整性保障。
  • TLS (Transport Layer Security),中文翻译“传输层安全协议”,1999年ISOC(互联网标准化组织)接替NetScape发布了SSL升级版本,也就是1.0版本的TLS,1.0版本的TLS和3.0版本的SSL非常接近,然而RFC文档里说的是

    the differences between this protocol and SSL 3.0 are not dramatic, but they are significant enough to preclude interoperability between TLS 1.0 and SSL 3.0

  • HTTPS 是基于SSL/TLS之上的HTTP协议

    对称/非对称加密

  • 对称加密是密码学里一种最基础的加密方式,所谓对称的意思指的就是可以通过加密算法反推出解密算法,所以,只要被人知道你的加密算法,你加密后的密文就会被破译,安全性相对较低。比如传统的单表代替加密算法,就是将密文中得字符转换成对应的ASCII码然后加或减一个数字,用得到的数字对应的ASCII码字符替换原来的字符,如果被人知道你的加密算法,只要逆序推出即可得到加密之前的明文。虽然其安全性较低,但是因为加解密过程是对称的,所以其效率高,加解密速度快。
  • 非对称加密则和对称加密正好相反,是一种双钥加密机制,其加密算法(公钥)和解密算法(私钥)并不相同(比如RSA非对称加密),使用这种加密方式,如果没有解密算法(私钥),就算有人截获了你的加密算法(公钥),也很难破译出密文,虽然安全性提高了,但是加解密时间却很长。

客户端与服务端的数据传输

客户端与服务端通过https进行数据传输时,主要有两个过程:先通过握手(handshake)建立连接,然后才进行数据传输。这个过程和TCP的三次握手之后再进行数据传输很像,因为HTTP协议就是基于TCP协议之上的应用层协议。
然而这两个过程之中数据加密方式却不一样,握手过程采用的是非对称加密进行数据包传输,而握手之后则采用对称加密方式进行数据传输

SSL/TLS握手过程

握手的整个过程就是为了双方协商出一个新的对称加密秘钥,我们称之为会话秘钥preview ,所以每次重新建立连接就会重新生成新的加密秘钥,可以理解成密码学中得一次性加密,从整体上提高了连接的安全性。
根据握手采用的秘钥交换方式(RSA/DH)不同,SSL/TLS握手方式主要有如下两种:

  • RSA方式握手
    • 客户端发出第一个数据包,请求建立连接,并附带上一个随机数p和支持的加密算法
    • 服务端接收到请求后,保存下随机数,并根据客户端支持的加密算法和自己支持的加密算法,选择出一种,发送第二个包,这个数据包中携带有SSL证书(证书中带有RSA公钥)和服务端产生的一个随机数q,同时附带上选择出的加密算法e1
    • 客户端接收到服务端回复后,再生成一个随机数m,通过p、q、m三个数和选择出的加密算法e1计算出新的加密算法e2(秘钥),然后使用SSL证书中的RSA公钥将m加密后得到m的密文mc,放到第三个数据包中发送给服务端
    • 服务端使用RSA私钥将mc还原成m,也使用p、q、m三个数和选择出的加密算法e1计算出新的加密算法e2(会话秘钥)
    • 握手完成,接下来就是使用新的加密算法e2(会话秘钥)进行数据的加密传输
  • DH方式握手
    • 客户端发出第一个数据包,请求建立连接,并附带上一个随机数p和支持的加密算法(这和RSA方式是一样的)
    • 服务端接收到请求后,保存下随机数,并根据客户端支持的加密算法和自己支持的加密算法,选择出一种,发送第二个包,这个数据包中携带有SSL证书(证书中带有DH公钥)和服务端产生的一个随机数q,同时附带上在选择出的加密算法e1(到这里和RSA方式也是一样的)
    • (上面生成两个随机数的过程是一样的,接下来就是DH和RSA方式不一样的地方了,但目的都是一样的,为了生成第三个随机数,只不过DH方式不是由client端来生成,而是双方使用各自给出的DH参数通过DH算法来生成第三个随机数)
    • 服务端继续发送数据包,此时数据包中有两个关键的东西:服务端生成的DH参数d1和数字签名证书
    • 客户端收到服务端的DH参数和数字签名证书后,先通过包含公钥的证书和数字签名确认对方身份,确认有效后,生成客户端的DH参数并将这个参数发送给服务端d2
    • 服务端收到客户端的DH参数后,两端都已经有如下几个东西:客户端随机数p、服务端随机数q、客户端DH参数d2、服务端DH参数d1,有了两个DH参数过后,两端就可以通过DH算法计算出相同的一个数值,这个数就是第三个随机数m,也就是双方都已经有了三个随机数p、q和m,那就可以用他们来生成新的加密算法e2(会话秘钥)了
    • 两端都有了新的加密算法e2(秘钥)后,握手成功,接下来就是使用新的加密算法e2(会话秘钥)进行数据的加密传输

参考资料