zoukankan      html  css  js  c++  java
  • https 原理,从头分析

    问题: 在http 中,内容是明文传输的,可以很容易的被截取和篡改,如下图

    https-1

    解决: 为了解决http的明文传输的问题,这个时候我们可以引入对称加密算法,客户端和服务端都维护同一个密匙,用于加密和解密,如下图

    https-2

    这个时候的确解决了数据被截取和篡改的问题。 但是,考虑一个场景,当有多个客户端的时候,情况会如何?

    https-3

    如上图,如果不做任何修改,只是添加客户端的话,那每个客户端都能够取得密匙, 那密匙也就不再是密匙了,而是任何人都能轻易得到的了。数据截取又会发生了。

    如何解决?可以考虑给每个client 不同的key

    这个时候情况就会路下图

    https-4

    这种方式有什么问题吗? 很容易发现key是被明文传输的,可以暴露在互联网中的,那能怎么办呢? 对key进行加密?但是如果对key 进行加密,又要引入新的密匙,而新的密匙又要进行传输,依然会存在被截取的问题。怎么解决呢? 这个时候就要需要引入非对称加密

    那么自然而然就会有一个问题需要解决,客户端如何获取公钥呢?

    总的来说有两种种可能:

    1. 服务器端把公钥发送给每一个客户端
    2. 让浏览器保存所有的公钥

    很明显,2 是不可能的。那只能是1. 如下图所示

    https-5

    但是服务器把公钥发送给客户端的时候,公钥就有可能会被掉包,这样的话,数据的截取和篡改又会发生了。

    怎么办?

    这时候就是现有https的解决方案了就要出场了

    这时我们需要引入CA 证书的概念, 不清楚的同学可以自己去 Google 下

    第一步: 需要网站到第三方机构申请CA 证书

    第二部: 浏览器和服务器可以根据申请得到的CA 证书使用 Https 协议

    Https 运行时序图:

    https-7

    在网上找到一个更好的 Https 加解密的流程图:

    https-6-How-HTTPS-Works

    如果还是不能理解,推荐阅读以下视频教程

    youtube: 12 Public Key Infrastructure

    Bilibili: 12 public key infrastructure

    参考:

    How Does HTTPS Work? RSA Encryption Explained

  • 相关阅读:
    random模块的随机变换
    re模块与正则表达式进阶
    面向对象整体细化
    __new__内部工作方式
    前端之CSS
    前端之HTML
    数据库
    同步异步阻塞非阻塞
    进程间的通信
    day 36(多进程)
  • 原文地址:https://www.cnblogs.com/wuyicqb/p/12728782.html
Copyright © 2011-2022 走看看