Haste makes waste

HTTPS的原理

Posted on By lijun

参考 HTTPS的原理SSL/TLS协议运行机制的概述,以及图解SSL/TLS协议

首先,与HTTPS相关的知识点有如下:

  • SSL/TLS
  • 对称加密、非对称加密、公钥私钥
  • 数字摘要,数字签名
  • 数字证书

另外,列出HTTPS的步骤:

  • 握手阶段(建立安全连接,非对称加密、数字摘要、数字签名、数字证书都是在这个阶段出现)
  • 通信阶段(这个阶段进行简单的对称加密通信)

1. HTTP HTTPS SSL/TLS的概念

如果网络通信只基于HTTP协议,信息是明文传输的,HTTP协议结合SSL/TLS协议后,就能实现加密的网络通信,这种通信协议也就是HTTPS协议。HTTPS协议的加密工作就是由SSL/TLS协议完成。

SSL/TLS层是介于应用层(HTTP就在这一层)和TCP层的传输安全层,下图是来自《HTTP权威指南》一书的截图:

image

SSL/TLS协议是为了解决这三大风险而设计的,希望达到: (1) 所有信息都是加密传播,第三方无法窃听。 (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。 (3) 配备身份证书,防止身份被冒充。

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

但这里存在两个问题:

  • 如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
  • 公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。

因此,SSL/TLS协议的基本过程是这样的,前两步是握手过程:

  • 客户端向服务器端索要并验证公钥。
  • 双方协商生成”对话密钥”。(非对称加密)
  • 双方采用”对话密钥”进行加密通信。(对称加密)

2. 关于加密的基础

关于加密,首先得知道一个概念,密钥是加密算法的一个参数,密钥就像调用一个函数时输入的参数。 而HTTPS中使用的加密算法基本公开的,所以加密的安全性取决于你对密钥的管理和保护。

HTTPS中涉及到的加密算法,包括以下三种。

  • 对称加密:DES,Triple-DES,RC2,RC4等
  • 非对称加密:RSA等
  • 不可逆加密:SHA-1,MD5等 接下来一一介绍这三种算法的特点以及应用场景

2.1 对称加密

密钥成对出现,而且两个密钥相同,两个密钥之间可以相互加密解密,对称加密的缺点在于维护密钥很麻烦,如果N个节点间相互通信,则每个节点需要给其他(N-1)个节点颁发一个唯一的密钥,所以一共需要产生N*(N-1)个密钥,管理成本很高。而接下来讲到的非对称加密对密钥的管理就容易多了。

另外,由于加密解密的密钥相同,所以,如果A需要和B、C两个人通信,则A需要给B和C颁发不同的密钥,否则B和C之间可以解密你发给他们任何一个人的信息。所以对称加密是一对一的,而下面即将讲到的非对称加密则是一对多的。

对称加密有一个优点,它的计算速度相比非对称加密更快。

2.2 非对称加密

密钥成对出现,而且两个密钥不同,一个叫公钥,一个叫私钥,公钥可以有多个,私钥则只能有一个。私钥一般存储于服务器,而公钥则是公开的,每个人都可以从服务器获取一把公钥。

非对称加密管理密钥很简单,服务器持有一把私钥,所有客户端可以从服务器请求获得一把公钥,大家获得的公钥都是相同的,公钥加密的信息只能由私钥解密,所以,虽然所有客户端的公钥相同,也不同担心他们解密其他人的信息。很明显,相比于对称加密的一对一关系,非对称加密是一对多的关系。

非对称加密有一个缺点,就是相比于对称加密,速度比较慢。

从上面的介绍,我们知道对称加密和非对称加密各有优点缺点,对称加密优点在于速度快,非对称加密优点在于管理密钥更方便,所以HTTPS扬长避短,在不同阶段使用这两种算法。HTTPS开始建立连接时,进行几次握手,这个过程使用非对称加密,这个过程完成后,客户端和服务器就会持有一个相同的密钥,接下来使用更快的对称加密进行通信。

好,回头看看文章开头讲到的HTTPS的两个阶段:握手阶段(建立通信阶段)和通信阶段。其实HTTPS的很多概念,诸如数字摘要,数字签名,数字证书,都是在握手阶段出现的,通信阶段只是简单的对称加密而已。

2.3 公钥私钥关系进一步理解

上面我们讲到对称加密的两个密钥可以相互加解密,那么非对称加密的公钥和私钥呢?它们可以相互加解密吗?

答案是可以,首先私钥由服务器使用,公钥由客户端使用,一般有以下两种场景使用公钥私钥

客户端使用公钥加密数据,服务器使用私钥解密数据 服务器使用私钥进行签名(涉及私钥加密),客户端使用公钥进行认证(涉及公钥解密) 这里提到的签名和认证,在接下来会讲到。我们先理解这一点,非对称加密中,公钥私钥是可以相互加密解密的

另外,非对称加密的实现原理,其中一步是生成两个不同的密钥,这两个密钥谁都可以当密钥和私钥,不过被选择作为私钥的一方,必须只能有一份,并且进行妥善管理,而公钥则可以公开。既然最初两个不同密钥,谁都可以当公钥和私钥,那么从这一点也可以侧面证明,公钥私钥是可以相互加密解密的。

2.4 非对称加密

非对称加密指HASH,MD5之类的不可逆算法,明文执行一次HASH算法生成数字摘要,数字摘要再进一步使用服务器的私钥生成数字签名。接下来会讲到这个流程。

3. 数字摘要,数字签名、数字证书

握手阶段,服务器拥有公钥和私钥,各个客户端可以从服务器申请获得公钥,握手阶段的最终目的是让服务器和客户端拥有一个相同的密钥,这个相同的密钥用于通信阶段的对称加密。

握手阶段,主要需要关注以下几个问题

  • 信息在发送过程是否被篡改
  • 通信的对象是否是第三方假冒的(中间人攻击)
  • 最终生成的对称密钥安全可靠 HTTPS的握手阶段就是围绕以上风险进行设计的。