HTTPS加密流程

目录

对称加密

非对称加密

证书


既然要保证数据的安全, 就需要加密, 网络传输中不再使用明文和传输了,而是使用加密后的密文, 加密的方式有很多种, 整体可以分为两大类, 对称加密和非对称加密.

对称加密

         对称加密实际上就是通过同一个密钥, 把明文加密称为密文, 然后通过这个密钥, 将密文解密为明文.

        一个很简单的例子就是, 按位异或, 假设明文a =  1234, key = 8888, 那么, 我们对这个a\进行加密得到了密文A = a ^ key = 1234 ^ 8888 = 9834. 如果要解密, 就可以对密文A进行相同的异或操作, 也就是a = A ^ key = 1234.

HTTPS加密流程_第1张图片

        如果客户端要向服务器发送一则明文, 需要对其先进行加密, 中途虽然可能被黑客截获到, 但是因为黑客没有密钥, 所以无法对密文进行解密, 也就无法知道密文里面的有价值的信息, 只能按照原路发给目标服务器, 服务器拥有密钥, 然后就可以通过这个密钥对密文进行解密.

        但是事情并没有想象的那么简单, 我们说, 一个服务器可以对很多个客户端提供服务, 也就是说需要同时管理很多个客户端的key,而且每个人用的key必须都是不同的:

HTTPS加密流程_第2张图片

 此时, 服务器就需要维护记录:

客户端1的key为key1;
客户端2的key为key2;
.........

以此类推..

        这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, 黑客就也能拿到了). 因此服务器就需要维护每个客户端和每个密钥之间的关联关系, 这也是个很麻烦的事情~

        因此就出现了一种比较理想的方式, 也就是, 在服务器和客户端建立连接的时候, 就提前协商好这次的密钥是什么.

HTTPS加密流程_第3张图片

         客户端首先将自己的密钥信息发送给服务器, 但是这个过程中被黑客截获到了, 然后服务器收到之后发送确认信息, 客户端收到这个确认信息之久,就知道了服务器已经知道密钥是多少了, 然后客户端才会发送加密后的密文给服务器, 黑客此时同样可以截获这个密文, 但是, 如果黑客已经拥有了密钥, 那么就可以获取到里面有用的信息.

        所以此时如果把密钥的信息也是明文传输的话, 那么前面的加密操作就形同虚设.

        因此密钥的传输也需要加密传输. 这就需要另外有一个加密方式了

非对称加密

        非对称加密要用到两个密钥, 一个叫做 "公钥", 一个叫做 "私钥".

  • 公钥, 就是告诉客户端, 明文需要通过何种方式加密
  • 私钥, 用来解密被加密过的密文

        公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多

HTTPS加密流程_第4张图片

  1. 服务器生成本地非对称密钥, 将公钥发送给客户端, 然后客户端使用此公钥来加密明文
  2. 客户端在本地生成对称密钥, 通过公钥加密, 然后发送给服务器
  3. 客户端将明文发送给服务器, 即使是被黑客截获, 但是没有服务器的私钥,是无法还原出原文的
  4. 服务器收到密文之后, 使用本地的私钥进行解密.
  5. 服务器获取到对称密钥, 后续通信只需要对称密钥即可, 即使截取到密文也不知道密钥是多少

        但是这样, 也并非绝对安全, 假设, 这个公钥如果被黑客给伪造了呢? 如果是伪造的, 那么该如何判别呢?

        如果使用被伪造的公钥加密, 然后被截取后, 黑客就可以直接还原里面的内容

        这就需要下面的证书了:

证书

        在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书.这个证书包含了刚才的公钥, 也包含了网站的身份信息.

        证书里面有这些属性:

  • 服务器的URL
  • 证书的过期时间
  • 颁布整数的机构
  • 服务器自己的公钥pub
  • ..........
  • 加密后的签名

什么是签名? 签名就是, 先对证书里面的所有属性, 计算出的一个校验和

再由证书颁布机构使用自己的私钥对这个签名进行加密:

HTTPS加密流程_第5张图片

 对比于非对称加密, 要想要让公钥不被伪造, 就将其换成证书, 如上图,

        客户端拿到证书之后, 首先会对证书的内容进行校验, 计算出校验和,然后得到了初始的签名,然后使用权威机构的公钥进行解密, 得到的签名为初始的签名sum1,sum2

        如果sum1和sum2不一样, 那么就可以说这个证书被篡改过,否则就是未被篡改过, 那么黑客是否可以为伪造一个证书呢?

        事实上是不行的, 在黑客拿到证书之后, 黑客虽然可以进行解密被加密的签名, 伪造证书之后(也就是将证书中的公钥换成自己的, 然后重新计算校验和, 也就是签名), 计算出的签名是无法加密的, 因为如果你要加密, 就需要拿到权威机构的私钥才能加密, 但是这个私钥只在权威机构哪里存在, 且没有直接暴露在网络当中.

        如果客户端这边识别到签名没有被加密, 那么就会发现这个证书已经被篡改

HTTPS加密流程_第6张图片

你可能感兴趣的:(javaSE,https,ssl,网络协议)