• http和https区别


    图解http文档

    http

    http - 浏览器和服务器交互的超文本传输协议
    https - http + ssl (建安全通道,确保数据传输,网站真实性)
    http 80 明文传输,身份易伪装,内容易窃取和篡改
    Https 443 需证书费用高 对传输内容进行加密 身份认证 费时费电 保证数据安全送达 一个ip只能绑定一个域名

    1. https链接访问
    2. 服务器将授权证书的公开钥匙返回给客户端
    3. 协商 SSL 链接加密等级
    4. 按照加密等级,建立会话密钥
    5. 然后通过网站的公钥来加密会话密钥
    6. 服务器用私钥解开会话秘钥
    7. 然后服务器用key对称加密数据
    8. 客户端拿到后,用key解密数据
    9. 之后会话都是通过key值完成的
      在这里插入图片描述

    HTTPS握手过程

    • 第一步,客户端给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法
    • 第二步,服务端确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数
    • 第三步,客户端确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给服务端
    • 第四步,服务端使用自己的私钥,获取客户端发来的随机数(即Premaster secret)。
    • 第五步,客户端和服务端根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程

    总结

    • 客户端发起 HTTPS 请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于构造对称加密算法的随机数
    • 通过证书中的公钥对随机数进行加密传输到服务端(随机对称密钥),服务端接收后通过私钥解密得到随机对称密钥,之后的数据交互通过对称加密算法进行加解密。(既有对称加密,也有非对称加密)

    介绍一个HTTPS工作原理

    我们可以把HTTPS理解成HTTPS = HTTP + SSL/TLS

    TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

    1. 对称加密

    加密和解密用同一个秘钥的加密方式叫做对称加密。Client客户端和Server端共用一套密钥,这样子的加密过程似乎很让人理解,但是随之会产生一些问题。

    问题一:  WWW万维网有许许多多的客户端,不可能都用秘钥A进行信息加密,这样子很不合理,所以解决办法就是使用一个客户端使用一个密钥进行加密。

    问题二:既然不同的客户端使用不同的密钥,那么对称加密的密钥如何传输?  那么解决的办法只能是一端生成一个秘钥,然后通过HTTP传输给另一端,那么这样子又会产生新的问题。

    问题三:  这个传输密钥的过程,又如何保证加密?如果被中间人拦截,密钥也会被获取,  那么你会说对密钥再进行加密,那又怎么保存对密钥加密的过程,是加密的过程?

    到这里,我们似乎想明白了,使用对称加密的方式,行不通,所以我们需要采用非对称加密👇

    2. 非对称加密

    通过上面的分析,对称加密的方式行不通,那么我们来梳理一下非对称加密。采用的算法是RSA,所以在一些文章中也会看见传统RSA握手,基于现在TLS主流版本是1.2,所以接下来梳理的是TLS/1.2握手过程

    非对称加密中,我们需要明确的点是👇

    • 有一对秘钥,公钥私钥
    • 公钥加密的内容,只有私钥可以解开,私钥加密的内容,所有的公钥都可以解开,这里说的公钥都可以解开,指的是一对秘钥
    • 公钥可以发送给所有的客户端,私钥只保存在服务器端。

    3. 主要工作流程

    梳理起来,可以把TLS 1.2 握手过程分为主要的五步👇

    • 步骤一:Client发起一个HTTPS请求,连接443端口。这个过程可以理解成是请求公钥的过程

    • 步骤二:Server端收到请求后,通过第三方机构私钥加密,会把数字证书(也可以认为是公钥证书)发送给Client。

    • 步骤三:

      • 浏览器安装后会自动带一些权威第三方机构公钥,使用匹配的公钥对数字签名进行解密。
      • 根据签名生成的规则对网站信息进行本地签名生成,然后两者比对。
      • 通过比对两者签名,匹配则说明认证通过,不匹配则获取证书失败。
    • 步骤四:在安全拿到服务器公钥后,客户端Client随机生成一个对称密钥,使用服务器公钥(证书的公钥)加密这个对称密钥,发送给Server(服务器)。

    • 步骤五:Server(服务器)通过自己的私钥,对信息解密,至此得到了对称密钥,此时两者都拥有了相同的对称密钥

    接下来,就可以通过该对称密钥对传输的信息加密/解密啦,从上面图举个例子👇

    • Client用户使用该对称密钥加密’明文内容B’,发送给Server(服务器)
    • Server使用该对称密钥进行解密消息,得到明文内容B。

    接下来考虑一个问题,如果公钥被中间人拿到纂改怎么办呢?

    客户端可能拿到的公钥是假的,解决办法是什么呢?

    3. 第三方认证

    客户端无法识别传回公钥是中间人的,还是服务器的,这是问题的根本,我们是不是可以通过某种规范可以让客户端和服务器都遵循某种约定呢?那就是通过第三方认证的方式

    在HTTPS中,通过 证书 + 数字签名来解决这个问题。

    这里唯一不同的是,假设对网站信息加密的算法是MD5,通过MD5加密后,然后通过第三方机构的私钥再次对其加密,生成数字签名

    这样子的话,数字证书包含有两个特别重要的信息👉某网站公钥+数字签名

    我们再次假设中间人截取到服务器的公钥后,去替换成自己的公钥,因为有数字签名的存在,这样子客户端验证发现数字签名不匹配,这样子就防止中间人替换公钥的问题。

    那么客户端是如何去对比两者数字签名的呢?

    • 浏览器会去安装一些比较权威的第三方认证机构的公钥,比如VeriSign、Symantec以及GlobalSign等等。
    • 验证数字签名的时候,会直接从本地拿到相应的第三方的公钥,对私钥加密后的数字签名进行解密得到真正的签名。
    • 然后客户端利用签名生成规则进行签名生成,看两个签名是否匹配,如果匹配认证通过,不匹配则获取证书失败。

    4. 数字签名作用

    数字签名:将网站的信息,通过特定的算法加密,比如MD5,加密之后,再通过服务器的私钥进行加密,形成加密后的数字签名

    第三方认证机构是一个公开的平台,中间人可以去获取。

    如果没有数字签名的话,这样子可以就会有下面情况👇

    从上面我们知道,如果只是对网站信息进行第三方机构私钥加密的话,还是会受到欺骗。

    因为没有认证,所以中间人也向第三方认证机构进行申请,然后拦截后把所有的信息都替换成自己的,客户端仍然可以解密,并且无法判断这是服务器的还是中间人的,最后造成数据泄露。

    5. 总结

    • HTTPS就是使用SSL/TLS协议进行加密传输
    • 大致流程:客户端拿到服务器的公钥(是正确的),然后客户端随机生成一个对称加密的秘钥,使用该公钥加密,传输给服务端,服务端再通过解密拿到该对称秘钥,后续的所有信息都通过该对称秘钥进行加密解密,完成整个HTTPS的流程。
    • 第三方认证,最重要的是数字签名,避免了获取的公钥是中间人的。
  • 相关阅读:
    Programming Languages PartA Week5学习笔记——SML进阶与编程哲学
    最全JAVA系列视频教程源码
    疫情后时代变了吗?
    使用devcpp遇到的常见错误解决方法
    创建Anaconda虚拟Python环境的方法
    图解LeetCode——687. 最长同值路径(难度:中等)
    Kafka 线上性能调优
    今年这情况。。真有点想读研了
    【JavaEE基础学习打卡08】JSP之初次认识say hello!
    Autowired注入的变量都是单例吗?
  • 原文地址:https://blog.csdn.net/formylovetm/article/details/127103360