概述

http协议采用明文进行通信,数据在通信链路上可能被劫持或者篡改,为了解决这个问题,通常采用的手段是对数据进行 加密,这也就引入了本文的主要讲解知识。

详解

https通信流程建立:

  • 客户端发起请求建立连接
  • 服务端接受请求,并返回公钥+证书
  • 客户端验证证书的有效性,并生成随机对称的秘钥,接下来使用公钥对对称秘钥加密,将请求发送到服务端
  • 服务端收到使用公钥加密的对称密钥之后,使用私钥解密对应的密文,就可以获取到对称密钥对
  • 接下来客户端和服务端的通信就使用对称秘钥进行通信

在上述过程中连接的建立是使用非对称秘钥,数据的传输则是使用客户端生成的随机对称秘钥进行通信,之所以这样 是因为非对称加解密对性能影响较大,因此只使用这种机制建立安全通道,一旦通道建立完成后就可以使用开销较小的 对称加密来进行数据的传输。

对称加密

所谓的对称加密是指加密和机密使用同一个密钥,这种加解密的操作又可以分为两种情况:

  • 密钥通过服务端颁发给客户端:这种情况下,我们需要将密钥从服务端传送到客户端,很显然,密钥在传输的过程中 必然是以明文的方式进行传输的(如果是密文传输,很明显就是一个逻辑错误),这很明显会引发新的问题,如果密钥被截取了,那这个过程不就又成了明文传输了嘛,毕竟 拿到密钥必然是可以对数据进行加解密了。
  • 密钥以约定的方式分别存储在服务端和客户端:为了解决密钥以明文的方式在网络上传输,我们可以采用的方式就是 不在网络上传输密钥,那么这就引出了第二中方案,那就是客户端和服务端约定密钥并分别存放到自己这里,不过很遗憾 这样做依然有一个缺陷,那就是通常情况下客户端通常是公开的,比如可能是个浏览器,那么当我们把密钥保存在浏览器的时候 ,我们并没有办法保证密钥的安全性。

如下图,演示对称加密的过程:

综上可以知道,通过对称加密的方式没有办法彻底的解决数据被篡改的问题。

非对称加密

上面我们分析了对称加密的原理以及安全性,对称加密安全性低的主要原因就是密钥的明文传输。为了解决这个问题引入了 非对称加密。从名字上较对称加密我们可以猜个大概:加密和解密使用的不是同一个密钥。确实是这样的,加密和解密使用的 是一对密钥:保存在服务端的是私钥,发送给客户端的是公钥。使用的过程中我们使用公钥加密,并在服务端通过私钥进行解密。 这样操作下来确实可以保证客户端到服务端的请求是安全的,反过来服务端需要发送数据给客户端的时候,则是通过私钥进行 加密,然后传送到客户端,客户端会使用公钥进行解密,在这个过程中可以看到的是,服务端传送回去的数据是会被拦截并 篡改的,毕竟公钥是透明化的,因此非对称加密只能保证客户端到服务端请求的加密,并没有办法保证服务端到客户端传输 的数据不被篡改。

具体流程如下:

相较于对称加密,非对称加解密的流程明显要复杂,因此单纯的从效率的层面上的话,非对称加密是比较低的。

混合加密

通过上面我们可以知道,使用对称加密效率高,非对称加密安全系数高,因此我们是否可以综合二者的优点,这就 形成了第三种加解密的方式:混合加密。整个加解密的过程分为两个阶段,分别是非对称加解密阶段、对称加解密阶段。 简而言之就是:采用非对称加密对对称密钥进行加密传输,完成对称密钥的传输之后,通信双方以对称密钥的方式进行传输数据。 以https通信为例(https是在http协议的基础上增加了一层SSL,用于构建加密的传输信道),具体流程如下:

存在问题

信息被篡改

在上面的几种加密的方式中,我们解决的主要矛盾是,信息在网络上传输的安全性的问题,不过如果有黑客截取了密文, 虽然解不出来明文是什么,但是可以胡改一通,这样服务端在收到信息的并进行解密的时候就可能会解密不出来或者 解密成错误的body,针对这种情况上面的几种加密方式很明显就没有办法保证了。为了解决这种信息被篡改的问题,一种 比较好的方式就是对传送的信息进行签名(简单点可以使用CRC、MD5来进行签名),具体流程如下

客户端

  • 客户端对需要传送的数据进行取hash,得到信息的摘要
  • 客户端使用密钥加密信息和摘要
  • 客户端发送加密数据到服务端

服务端

  • 使用私钥对接收到的密文进行解密
  • 通过hash算法hash数据,校验摘要信息是否匹配

身份认证

虽然可以通过签名解决信息被篡改的问题,但是依然没有办法确定客户端就是客户端,毕竟你没有办法证明你就是你啊。 那么为了证明我就是我,怎么做呢?通常我们会拿出身份证来证明,在网络中是怎么证明的呢?那就需要三方权威机构 给我们提供类似于身份认证的问题,这个机构就是CA,具体流程如下:

  • 客户端请求CA来申请证书
  • CA给客户端办法证书,证明你就是你
  • 客户端携带证书传送数据到服务端
  • 服务端就收到客户端信息之后,就去除证书去CA认证你是不是你
  • CA机构返回认证信息给服务端,之后服务端响应客户端的请求

小结

我们经常见到的事物看似简单,但是仔细分析一下会发现我们可能仅仅会使用这个功能,而至于底层的原理我们不想了解, 恰恰这些东西才能真正的提升自身的竞争力吧,毕竟hello world谁都会写。