谈谈https加密是怎么实现的?

首先解释什么是加密

  • 加密就是把一段明文,通过一个密钥,并通过某一种算法,计算出对应的一段密文,这个过程就叫加密。可以理解为(明文+密钥)*算法 = 密文。反之可以通过密文和密钥来解析出明文。

我们知道http本质上是没有任何安全措施的,https的本质是为了解决,在http传输中,数据未加密产生的安全问题,所以我们想,能不能通过一个密钥来加密我们的数据,就像上面的公式:(明文+密钥)*算法 = 密文,然后再通过http传输这个密文,这样就能解决安全问题了。

但是问题来了,客户端(client)很容易就可以实现(明文+密钥)*算法 = 密文这个步骤,但是将密文发送到服务端(server)后,服务器是没有加密密钥的,那如何根据密文解析出明文呢?

要解决这个问题其实很简单,把密钥给服务器,服务器不就能通过密钥和密文来计算出明文了吗。看似很简单,但紧接着问题来了,如何将密钥给服务器呢?每个client的密钥肯定是不一样的,如何安全的将密钥给服务端,就成了最大的问题。

其实https就是为了解决这一痛点而产生的,https做的事情很简单,就是安全的将密钥从client发送到server,让client和server都拥有这个密钥,这样就能通过密钥来加解密数据了。如何实现呢?如图:
image

首先,server中有一个公私钥对公钥进行加密的数据,能通过私钥解密出来,也就是非对称加密。这个公私钥对,就是用来安全传递加密密钥的。

  1. client先向server请求公钥。
  2. client拿到server的公钥后,将密钥用公钥进行加密,再将加密后的密钥,传递给server。
  3. server拿到client通过公钥加密后的密钥,通过自己的私钥进行解密,这样就得到了真正的密钥。
  4. client和server都拿到了密钥,现在就可以使用这个密钥来进行数据传递的加密了。

这样,https的技术实现就完成了,也就是SSL握手环节的实现。但是问题又来了,服务器上的公私钥对,如何保证是安全的呢?比如某一台服务器的公私钥对,是从别人的服务器上盗取来的呢?

所以,需要有一个权威机构来颁布https公私钥对,也就是https证书,向权威机构申请,权威机构就会下发一个数字证书,包括了一对公私钥。这个证书是跟域名和ip地址绑定的,盗用别人的也没用。

这样,通过https,安全的数据传输就实现了