网络编程-HTTPS协议的实现原理

HTTP传输协议缺点

  • 之前几篇文章中详细讲解了TCP/IP协议栈中的几个协议,其中个就有对HTTP做了一个比较详细的讲解。HTTP是基于TCP进行传输的,其中传输的内容都是明文报文数据,如果我是一个黑客,我会想办法获取这个HTTP消息体,那我可以直接肉眼就能看出消息中的所有内容。这其实是存在很大风险的,如果HTTP消息被劫持,那么整个传输过程将存在风险,正因为存在以下三种风险,HTTP变成了一种不安全的协议
    • 第一,窃听风险(eavesdropping):第三方可以窃取通信内容
    • 第二,篡改风险(tampering):第三方可以修改通信内容
    • 第三,冒充风险(pretending):第三方可以冒充他人身份参与通信
加密协议SSL/TLS
  • 互联网中加密通信协议是通互联网共同发展的一门技术。
    • 1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
    • 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
    • 1996年,SSL 3.0版问世,得到大规模应用。
    • 1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
    • 2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
  • 目前应用最广的是TLS1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS1.2 的支持。
  • TLS1.0通常被标记为SSL3.1,TLS1.1为SSL3.2,TLS1.2为SSL3.3
更加安全的HTTPS
加密算法
  • 加密算法有历史悠久的发展,在一战二战中,都有广泛使用,所以密码学在社会发展种有广泛的用途

  • 第一对称加密:有流式,分组两种,加密和解密都是使用的同一个秘钥,例如DES,AES-GCM,ChaCha20-Poly1305等

  • 第二非对称加密:加密使用的秘钥和解密使用的秘钥是不同的,分别称为:公钥,私钥,公钥和算法都是公开的,私钥是保密的。非对称加密性能较低,但是安全性超强,由于加密特性,非对称加密算法能加密的数据长度也是有限的。例如:RSA,DSA,ECDSA,ECDHE

  • 第三哈希算法:将任意长度的信息转换为较为固定的长度的值,通常其长度要比信息小得多,且算法不可逆。例如:MD5,SHA-1,SHA-2,SHA-256

  • 第四数字签名:签名就是在信息的后面加上一段内容(信息经过hash后的值),经过hash后的值,可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。

对HTTP消息体对称加密

在这里插入图片描述

  • 如上图中,展示了HTTP客户端发出的请求很容易被黑客接货,如果此时黑客冒充服务器,或者黑客窃取信息,则其可以放回任意信息给客户端,而且不被客户端察觉,所以我们经常会听到“劫持”这个词
    在这里插入图片描述

  • 如上图是一个简单HTTPS经过TCP 的三次握手后,客户端与服务器建立连接,如果对后续双方传输的内容进行对称加密,那么理论上我们在本次传输中防止了内容的裸奔。缺点在于:

    • 但是由于对称加密使用的秘钥两端是一样的,要维持每一个客户端的秘钥不一致,整套加密才有意义(比如我是黑客伪造的客户端,如果秘钥一致,那么黑客还是能拿到秘钥,那没有任何意义)。但是遇到的问题是产生n个不同的秘钥,N=客户端数量,维护困难。
    • 另外,因为对称加密需要双方协商一致,一般提前约定,或者使用前传输秘钥,不管哪一种方式,很容易秘钥泄露。只要黑客拿到秘钥,那么所谓加密传输也就失去意义。
对HTTP消息体进行非对称加密
  • 如下图我们使用非对称加密
    在这里插入图片描述
  • 上图中客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但是上述过程也存在缺点:
    • 公钥是公开的(也就是黑客也会有公钥),所以第4 步私钥加密的信息如果被黑客接货,就可以使用公钥进行解密,获取其中的内容。
    • 非对称加密不适用数量太大的报文,大数量的报文导致加密效率降低
对称加密和非对称加密结合使用
  • 对称加密的优势:对称加密如果能保证秘钥不被黑客获取,那么他是安全的,并且对称加密的速度具有很大优势

  • 非对称加密优势:非对称加密请求发起时候尽管使用的是公钥加密,但是因为必须使用私钥解密的特点,因此能够保证消息体在想服务器发送过程中是安全的。

  • 两者结合做法:

    • 使用对称加密对消息体进行加密
    • 对称加密的算法和对称秘钥使用公钥加密后,在ClientHello时发送给服务器
    • 后续双方的内容进行对称加密
      在这里插入图片描述
  • 如上图,我们之前说了秘钥交换在第一步进行,一下几个步骤意义如下:

    • 第3 步时候,客户端给服务器说:(之后回话用对称秘钥,这是对称算法XXX,和对称秘钥XXX),这段话用公钥进行加密,然后传给服务器。
    • 第4步时候,服务器收到信息后,用私钥解密,提取出对称加密算法和对称秘钥后,服务器回复:(好的)并用对称秘钥加密
    • 后续两者之间的信息传输就可以使用对称加密的方式了。
  • 使用这个方式时候,还有部分问题:

    • 如何将公钥给客户端
    • 客户端在获取一个公钥后,如何确认公钥是正确的服务端发出的而不是黑客伪装的

在这里插入图片描述

  • 如上图的情况第一步中公钥获取是存在风险的,而且直接在某个地方下载公钥也是不可靠的,因为黑客也可以在下载公钥的时候劫持了请求,并伪造公钥返回给客户端。后续的请求都会被黑客欺骗。

  • 解决方案是使用证书:

    • 证书是一个经证书授权中心数字签名的包含公开秘钥拥有者信息以及公开秘钥的文件,最简单的证书包含:公开秘钥,名称,证书授权中心数字签名。数字证书还有一个重要特征就是旨在特定时间段内有效
    • 数字帧数是一种权威性的电子文档,可以由权威工作的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书,也可以由企业级别CA系统进行签发。
  • 如下证书模式HTTPS:
    在这里插入图片描述

  • 如上图,2步骤时候服务器发送了一个SSL证书给客户端,SSL证书中包含的具体内容有:

    • 证书发布机构CA
    • 证书有效期
    • 公钥
    • 证书所有者
    • 签名
  • 客户端在接受服务器发来的SSL证书会对证书进行校验,以浏览器为例说明如下:

    • 首先浏览器读取证书中的证书所有者,有效期信息进行校验
    • 浏览器开始查找操作系统中已内置的收信人的证书发布机构CA,与服务器发来的证书中的颁发者CA对比,用于校验证书是否为合法机构颁发
    • 如果找不到,浏览器报错,说明服务器发来的证书是不可信的。
    • 如果找到,浏览器会从操作系统中取出颁发者CA的公钥,然后对服务器发来的证书里面的签名进行解密
    • 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值域证书中签名做对比
    • 对比结果一致,则证明服务器发来的证书核发,没有被冒充。
    • 此时浏览器就可以读取证书中公钥,用于后续加密了。
  • 通过SSl证书的形式,即解决了公钥获取问题,又解决了黑客冒充问题,HTTPS加密过程也就此形成。所以对不HTTP,HTTPS传输更安全。

    • 所有信息都加密传播
    • 具有校验机制,一旦被篡改,通信双方立刻会发现
    • 配备身份证书,防止身份被冒充。

上一篇 网络编程-TCP/IP协议栈-UDP/HTTP协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从案例角度解析建模平台动态规则引擎

源宝导读:明源云ERP建模平台提供了强大的页面联动规则引擎,原来需要编写代码完成的联动控制逻辑,现在只需要点点鼠标,通过配置完成。本文从实际案例的角度出发,介绍原始的代码逻辑如何转化为引擎规则的过程。一、背景明…

想基于K8s按需扩展应用程序,可从这几方面入手

马修赫瑟(Matthew Heusser)在花费了十年时间进行编程,测试和项目管理之后,Matt Heusser于2011年创立了自己的公司Excelon Development。该协会前董事会成员Matt还是软件测试人员,是德国波茨坦最具影响力的敏捷测试专业…

windows环境下ELK平台搭建

背景 日志系统主要包括系统日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器的软件,硬件信息,检查配置过程中的错误以及错误发生的原因。通常分析日志可以了解服务器的负荷,性能安全性,从而及时…

EntityFramework Core 3.x上下文构造函数可以注入实例呢?

今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢?老规矩,首先我们定义如下上下文public c…

SpringCloud常见问题总结(一)

Eureka常见问题 Eureka注册服务慢 默认情况,服务注册到Eureka Server 的过程比较慢。在开发或者测试时候,如果能够加速注册的过程,从而提升工作效率。Spring Cloud官方文档详细描述了该问题的原因并提供了解决方案: //原文 Why…

[剑指offer]面试题21:包含min函数的栈

面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 栈内压入3、4、2、1之后接连两次弹出栈顶数字…

IO 模型知多少

1. 引言同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型&am…

[剑指offer]面试题22:栈的压入、弹出序列

面试题22:栈的压入、弹出序列 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列4、5、3、2、1…

Ubuntu上安装使用Docker

Docker简介 Docker是一个开源的容器引擎,他有助于更快的交付应用。Docker可以将应用程序和基础设施层做隔离,并且能将基础设施当做程序一样进行管理。使用Docker,可以更快的打包,测试以及部署应用程序,并且可以缩短从…

让 .NET 轻松构建中间件模式代码

让 .NET 轻松构建中间件模式代码Intro在 asp.net core 中中间件的设计令人叹为观止,如此高大上的设计何不集成到自己的代码里呢。于是就有了封装了一个简单通用的中间件模板的想法,以后有需要的时候就可以拿来即用。接口定义这里按执行的委托是同步还是异…

[剑指offer]面试题26:复杂链表的复制

面试题26:复杂链表的复制 题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指…

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件,类似txt,只不过名字是Dockerfile,里面编辑Docker的一些指令,指令作用在于描述构建镜像的细节。如下一个简单的案例,用上一节中下载的nginx镜像来…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日,红帽公司宣布,产品和技术总裁 Paul Cormier 即日起任红帽总裁,并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者,这一模式促使红帽达成连续超70个季度的盈利,身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中,对数据进行持久化,或者需要在多个容器直接进行数据共享,这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式: 数据卷(Data Volumes):容器内数据直…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》,我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络,这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件,我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成,并且支持以#开头的注释一般包括四个部分:基础镜像信息,维护者信息…

创业的N种死法

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片,开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术(cgroups, namespace,分层文件系统)在Docker之前已经存在很多年,并且 Linux Containers(LXC)也在很多企业的环境中得到了大量的应用实践,并得到明…

dotNET Core 3.X 请求处理管道和中间件的理解

理解 dotNET Core 中的管道模型,对我们学习 dotNET Core 有很大的好处,能让我们知其然,也知其所以然,这样在使用第三方组件或者自己写一些扩展时,可以避免入坑,或者说避免同样的问题多次入坑。本文分为以下…

了解.NET中的垃圾回收

原文来自互联网,由长沙DotNET技术社区编译。尽管这是一篇来自2009年的古老的文章,但或许能够对你理解GC产生一些作用。 了解.NET中的垃圾回收一旦了解了.NET的垃圾收集器是如何工作的,那么可能会触及.NET应用程序的一些更为神秘的问题时&…