深入浅出对称加密、非对称加密、数字签名和数字证书

718 阅读8分钟

本文介绍对称加密、非对称加密和数字签名等这些我们耳熟能详的概念,并通过一个具体的例子一步步带你深入理解它们在互联网通信过程中扮演的作用。他们是理解 https 工作原理的基础,希望通过本文的介绍,你对它们有一个清晰的认识。好了,下面开始我们的加密之旅吧。

在讨论加密时,我们有一个很重要的前提:通过互联网传输的任何信息都是可以被第三方( Hacker )截获的

1. 基础概念

  • 对称加密

    需要对加密和解密使用相同密钥的加密算法。对称性加密也称为密钥加密。加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。

  • 非对称加密

    不像对称加密只有一个密钥,在非对称加密中有两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥和私钥是一对,如果使用公钥对数据进行加密,那么只有私钥才能解密。因为加密、解密使用不同的密钥,因此称这种加密方式为非对称加密。下面通过一个例子说明非对称加密进行信息交换的原理。

    现有 A、B 双方进行通信:

    1. A 生成一个密钥对公钥私钥),并将公钥公开。

      注意:这里任何人都可以拿到 A 的公钥

    2. B 使用 A 的公钥将通信内容加密,发送给 A。

    3. A 收到消息,使用自己的私钥将其解密。至此 B --> A 的通信过程就完成了。

    4. A --> B 的通信同理。

    非对称加密固然很安全,但是因其算法复杂,加密、解密过程需要消耗大量的计算时间。在进行大量信息交换的时候,非对称加密显然会降低通信效率。

    现在我们知道,对称加密虽然简单、高效,但是其密钥不能在互联网上传输。而非对称加密虽然安全,但是其计算复杂,加解密低效。于是,在实际的运用中,往往是将两者进行结合使用。其过程就是:通信一方用对方的公钥对称加密密钥加密, 另一方收到后,用自己的私钥解密得到密钥。之后双方通信使用这个密钥进行加密。

  • 数字签名

    通过对称加密与非对称加密,我们可以确保信息是安全的。而数字签名技术是为了确保信息没有被篡改,保证信息的完整性的。一般做法是:使用 hash 算法对我们的信息做一次 hash 运算后得到一个 hash 串。注意: 这个过程是不可逆的,即通过这个 hash 串 是无法反推通信内容的。并且如果信息被修改,会得到一个不一样的 hash 串。

    得到这个 hash 串之后,会将其进行加密并与通信内容一起发送给对方。其收到信息后解密得到通信内容和 hash 串,并使用同样的 hash 算法对内容进行 hash 求值。如果得到的 hash 串 与收到的 hash 串一样,则通信未被修改。

2. 实例推演

接下来我们通过客户端( Client )、服务端( Server )的例子,对这些概念做一个清晰的分析。

未加密情况

Client --> Server: 你好
Server --> Client: 你好,我是服务器

这种情况下,黑客是完全可以冒充服务器与你进行通信的。所以需要对服务器的身份进行验证。那么如何验证呢?答案就是通过非对称加密。我们知道在非对称加密中会生成一对密钥对,这里 Server 端保留私钥。Client 要 Server 证明身份,首先 Client 会发送一个随机字符串给 Server,然后 Server 用自己的私钥进行加密(由于其他人没有 Server 的私钥,所以无法对这个随机字符串加密), Client 收到这个加密的字符串,解密并比对。一致则认为是 Server。通信过程如下:

改进 1

Client --> Server: 你好
Server --> Client: 你好,我是服务器
Client --> Server: 证明你是服务器,随机字符串
Server --> Client: 随机字符串(私钥加密)

上述过程用使用到了服务器的私钥。当 Client 收到 Server 的消息后,用 Server 的公钥解密,并将解密得到的信息与这个随机字符串进行比对,验证通过说明确实是 Server,然后进行下面的通信。这个时候假设有 Hacker 想冒充 Server:

Hacker --> Client: 你好,我是服务器
Client --> Hacker: 证明你是服务器,随机字符串
Hacker --> Client: 随机字符串( ... )

由于 Hacker 没有 Server 的私钥,故其无法对这个随机字符串进行加密。Client 收到消息解密对比不成功,通信中断。

上面的方法看似完美,但是存在一个致命问题那就是 Client 如何拿到 Server 的公钥。因为公钥、私钥对谁都可以生成。如果 Hacker 也生成一对密钥对,将其公钥发送给你,那么 Hacker 也就可以冒充服务器与你进行通信。

Hacker --> Client: 你好,我是服务器
Client --> Hacker: 证明你是服务器,随机字符串
Hacker --> Client: 随机字符串( Hacker 的私钥 )

上面的通信过程就是 Hacker 使用自己的私钥进行加密。 Client 收到消息使用 Hacker 的公钥解密之后比对,也是可以冒充 Server 的。既然公钥不能直接在网络上进行传输,那我们如何获取 Server 的公钥呢?于是数字证书粉墨登场。

数字证书:在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。数字证书一般包含证书的发布机构证书的有效期公钥证书所有者签名所使用的算法指纹以及指纹算法等信息。

有了数字证书的概念,我们对上述通信过程再次进行改进。

改进 2

Client --> Server: 你好
Server --> Client: 你好,我是服务器,这是我的证书
Client --> Server: 证明你是服务器,随机字符串
Server --> Client: 随机字符串(私钥加密)

这里 Server 会把自己的证书发送给 Client,而这个证书里面就包含了 Server 的公钥。

OK,到此 Server 的身份验证告一段落。那么问题又来了:

  1. 这个证书是如何颁发给 Server?

    证书可以被坏人伪造,Server 需要确保这个证书确实是正规颁发机构颁发的。

    其实,颁发机构首先会给自己颁发一个证书。颁发机构在颁发证书的时候,会使用数字签名算法生成证书的指纹,并用自己的私钥将该指纹加密后放到证书里面。那么这个颁发机构自己的证书是怎么到达 Client 的呢?它不能直接发给 Client,因为那样又需要对颁发机构自己的证书做证书认证,就陷入无限循环了。其实这个颁发机构自己的证书在我们安装好操作系统的时候就已经安装到我们的操作系统中了,而这些机构是经过权威安全机构评估后选取的。

  2. Client 如何验证 Server 的证书?

    证书可以被 Hacker 截获并伪造,Client 需要确保证书确实是 Server 的。

    Client 在收到 Server 发过来的证书的时候,会读取证书中的颁发机构,验证过程如下:

    1. 拿到这个颁发机构后,到操作系统中查询该颁发机构的证书。如果没有找到,说明证书可能有问题,Client 会弹出错误信息。
    2. 如果找到,读取证书里面的公钥并将加密后的指纹解密。然后使用证书里面的数字签名算法,计算从 Server 收到的证书的指纹。两者比对结果一致,证书未被篡改;否则证书被篡改。

3. 完整过程

Client --> Server: 你好
Server --> Client: 你好,我是服务端,这是我的证书
( 证书验证 )

Client --> Server: 证明你是服务器,随机字符串
Server --> Client: 随机字符串( 私钥加密 )
( Client 收到 Server 加密后的字符串,用证书中的公钥解密,对比 )

Client --> Server: 我们之后的通信用这个(密钥)
( Server 收到 Client 的密钥,之后双方通信将使用这个密钥加密 )

结语

这里大概讲述了通信双方如何使用对称加密、非对称加密、数字签名和数字证书的工作原理,它们是 https 运行的基础。学习完本文之后,对于你理解 https 的工作原理是有很大帮助的。当然其中还有很多细节没有讲到,如果有什么地方没有讲解清楚或者有什么细节想要了解的,可以在评论区留言。下一篇文章我会详细介绍 https 的工作原理。