更安全的Web通信HTTPS

1. HTTP协议存在的问题

阅读本篇需要对HTTP协议有最基本的了解。 借用《图解密码技术》里的图片,我们以如下一个购物场景开始介绍:

在网购过程中,如果使用纯粹的HTTP协议,那么用户的账号密码,信用卡,银行卡信息都将在信息传输过程中直接裸奔。从例子中我们可以看到信用卡信息直接被明文传输了。除了明文传输之外,还存在着以下两个问题:

  1. 无法验证通信方身份的真实性,即无法确认对方是否是真正的商家。
  2. 无法确认信息是否被篡改,即无法确认传输过程信用卡信息和收货地址是否被篡改过。

常规情况下,可以对通信的内容进行加密,来避免明文传输的问题。但是单靠这点,无法解决信息完整性和认证问题。为了解决这些问题,需要对通信进行加密。也就引入了 HTTPS 。

2. HTTPS结构

2.1 HTTPS与HTTP

HTTPS 本身并不是一个协议,它使用 SSL/TLS 作为对通信加密的协议,承载 HTTP ,将两种协议叠加,来实现对 HTTP 通信进行加密的目的。二者的关系为 HTTP 加密 认证 完整性保护=HTTPS 单纯从层次上对比二者的差异为:

即在 HTTP 协议下又加了一层 SSL,计算机网络通信过程的信息流动方向是发送方信息由上到下进行包装,然后接收方将信息由下到上进行解包。上述的购物场景,如果使用了 SSL/TLS 承载 HTTP,那么通信的流程将会变化成如下图:
无论是客户端,还是服务端,消息发送的时候,都是从上往下,经过了 SSL/TLS 加密,然后接收的时候再由下往上解密。

看到这里你可能对流程已经有所理解,但又存在疑惑: SSL/TLS 是什么东西?

2.2 SSL/TLS

SSL(Secure Socket Layer),称为安全套接层,是1994年网景公司设计的一种安全协议,用于解决了网络通信安全和数据完整性问题。第一个版本的TLS(Transport Layer Security) 是在 SSL3.0基础上设计的,可以理解为 SSL 3.1。后续的 TLS 版本又加入了更多特性,可以把它理解为是 SSL 的升级版。

2.3 SSL/TLS 位于哪一层?

目前普遍的说法是 SSL/TLS 无法确切地被划分到 OSI 或者 TCP/IP 的具体某一层。从逻辑上来讲,SSL/TLS 的加密功能正好能和 OSI的表示层相对应,但是一些应用程序会把它当做传输层。所以比较保守的说法是SSL/TLS介于传输层和应用层之间

2.4 TLS结构简介

SSL/TLS 不仅可以承载 HTTP,也可以承载其他应用层协议。

协议本身可以分成两层,上层是握手协议,下层是记录协议。如下图:

上层又分成了4个子协议,其中第一个握手协议是最重要的,它的作用是确认双方使用的密码套件,双方共享密钥,基于证书的认证操作。 其他三个子协议的作用分别是:

  • 密码规则更变协议:通知对方要交换密码了
  • 警告协议:把错误信息传给对方
  • 应用数据协议:将承载的数据传达给对方

记录协议位于下层,它的作用是使用对称加密的方式对消息进行加密通信,过程可以再进一步细分为:

  1. 将消息分割成多个片段,每个片段进行压缩。
  2. 压缩后的片段,加上消息认证码,用于保证完整性,并进行数据认证。消息认证码的密钥在握手结束后可以生成,下面会介绍。
  3. 上面生成的东西,通过对称加密,加密使用CBC模式,而CBC模式的初始化向量,以及对称加密的密钥,都可以在握手完成,通过主密码生成,下面会介绍。
  4. 经过上面加密之后,再加上一个报头,就是最后的报文数据了。这个报头由数据类型,版本号,压缩后的长度组成。其中数据类型是上层握手协议的4个子协议之一。

HTTPS握手过程

我们知道 HTTP 是基于 TCP 来完成的,TCP有握手过程,HTTPS同样也有握手过程。当我们谈论 HTTPS的时候,其实更侧重的是谈论 SSL。

默认情况下 HTTP 通信,客户端会打开一条到服务器端口80的连接。而 HTTPS 则会打开一条到服务器端口443的连接。 TCP 连接建立后,会初始化 SSL,沟通加密参数,交换密钥,完成握手过程后,SSL 初始化完成。然后就可以加密通信了。

我们在谈论HTTPS握手过程,其实就是SSL的握手过程。这个握手过程分成4个部分。下面将详细地解析这4个部分。

一: 客户端 -> 服务端

客户端向服务端发送Client Hello,告诉服务端它能理解的密码套件(RSA/3DES等),压缩方式,会话id,当前时间,SSL/TLS 协议的可用版本,客户端随机数。

二: 服务端 -> 客户端

  1. 服务端向客户端发送Server Hello。
  2. 服务端发送Certificate,以及把证书清单发给客户端,里面包含了公开密钥的证书。
  3. Certificate不足以满足需求的时候,还会发送 ServerKeyExchange,告诉客户端使用这些信息来进行密钥交换。
  4. 服务端向客户端发送CertificateRequest消息,发送了服务端能理解的证书类型清单和能理解的的认证机构名称清单。
  5. ServerHelloDone

三: 客户端 -> 服务端

  1. 如果收到 CertificateRequest,会向服务端发送Certificate消息,以及发送自己的证书。
  2. 发送 ClientKeyExchange以及经过加密的预备主密码(随机数)。这个报文是经过加密的,加密的公钥就是服务端发送Certificate时,发给客户端的公钥。
  3. 如果收到 CertificateRequest,还会发送 certificateVerify消息,告诉服务端它就时客户端证书的持有者本人。
  4. 客户端发送changeCipherSpec消息,告诉服务端要切换密码了(实际上这个是密码规则更变协议里的东西)。服务端收到这个消息后,双方同时切换密码
  5. 客户端发送 Finished (这时候客户端使用已经切换后的密码套件来发送)

四: 服务端 -> 客户端

  1. 服务端发送 changeCipherSpec,告诉客户度要切换密码了
  2. 服务端发送 Finished 表示结束。 然后就切换到了应用数据协议。之后双方使用应用数据协议和TLS记录协议来进行密码通信。

握手过程一共完成的工作有:

  1. 客户端获得服务端的合法公钥(第二部分第二点),完成服务端认证。
  2. 服务端获得客户端的合法公钥(第三部分第一点),完成客户端认证。
  3. 双端生成通信中对称加密的共享密钥。
  4. 双端生成消息认证中的共享密钥。

HTTPS 采用了混合加密机制。在握手环节使用公钥加密方式。通信建立后,交换报文时,使用共享密钥加密,也就是上面第3和第4点。对称加密会比非对称加密快很多,提高通信过程的效率。共享密钥的生成过程,可以从这张图中去理解。

客户端和服务端可以拥有一样的预备主密码,在握手的开始阶段,双方协商了共同使用什么密码套件。预备主密码同时使用由密码套件中两个单向散列函数(MD5和SHA-1)组合的伪随机数生成器,生成主密码(客户端的预备主密码也是使用伪随机数生成)。两端都会根据这个一样的预备主密码,计算出一样的主密码。然后再由一样的主密码,生成下面三个:

  • 用于对称加密的密钥
  • 消息认证码的密钥
  • 对称密码的CBC模式中使用的初始化向量

每一样都有两份,即客户端发往服务端,和服务端发往客户端。所以主密码一共可以生成6种信息。

以上就是HTTPS握手过程的详细解析。握手建立完成后,客户端和服务端有拥有对称加密的密钥,那么就可以使用这个密钥对通信内容进行加密了。

HTTPS相对于HTTP有什么不一样?

总结一下,HTTPS多做了什么,它和HTTP有什么不一样。

  • HTTP是明文传输,HTTPS是加密传输
  • HTTPS需要申请证书,有一定成本
  • HTTP使用80端口,HTTPS使用443端口
  • HTTP没有身份认证,HTTPS有身份认证
  • HTTP报文完整性无法验证,可能被篡改。HTTPS可以验证。

参考资料

图解密码技术

图解HTTP

HTTP权威指南

Transport Layer Security

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

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

相关文章

CSS入门指南——页面的水平居中

我们经常看到这样的网页,即内容水平居中在屏幕中间,左右留白。我们来给这样的布局起个名字——水平居中布局 其实要实现这样的布局十分简单,即给中间部分一个宽度,设置margin左右值为auto,如,中间部分class"main&…

mysql explain的使用

一、explain返回各列的含义: 1、table:显示这一行的数据是关于那张表的 2、type:重要的列,显示连接使用了何种类型,从最好到最差的连接类型为const、eq_reg、ref、range、index、ALL 3、possible_keys:显示…

使用 Canvas 生成公众号头图

熟悉“前端晚自修”的朋友们应该知道,我们每期的头图除了上面的文字随着每期变动以外,几乎是一模一样的(因为太懒了~)。这个头图虽然丑了一点,但是也还说的过去,毕竟是我倾尽毕生艺术细胞拼出来的&#xff…

Flask mysql 模版传参_Flask渲染Jinja2模板和传参

### Flask渲染Jinja2模板和传参:1. 如何渲染模板:* 模板放在templates文件夹下* 从flask中导入render_template函数。* 在视图函数中,使用render_template函数,渲染模板。注意:只需要填写模板的名字,不需要…

08 Spring框架 AOP (一)

首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充。 面向对象编程是从静态角度考虑程序的结构,面向切面编程是从动态的角度考虑程序运行过程。 AOP底层…

移动spa商城优化记(一)---首屏优化篇

背景 随着公司业务的不断壮大,最近老是有用户反应公司APP内的商城打开比较慢,这可不行啊,慢了容易流失用户,流失用户减少公司业绩,公司业绩少我的年终奖就少…………,所以为了公司,也为了自己&a…

hprose for java 教程_hprose for java源码分析-4

4.1 疑窦丛生书接上回。上回说到,从HproseClient.java ------------------------- (#0)invokeHandler.handle()开始,将经历一个漫长的调用过程,下面把整个调用链粘出来,先认识下这个庞然大物。( >>> 表示调用到&#xff…

java批量提取文件夹名称_bat 批量提取指定目录下的文件名

bat 批量提取指定目录下的文件名下面是批量获取指定目录下的文件名的核心代码echo offecho text inputset inputset /p input:echo %input% is inputcd %input%rem echo onfor %%a in (*) do (echo %%a is input)cd ..如下是sql server执行对应脚本文件sqlcmd -Spcserver -dmas…

埃及分数The Rotation Game骑士精神——IDA*

IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题。 估价函数设计思路:观察一步最多能向答案靠近多少。 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一…

美团扫码付的前端可用性保障实践

开篇 2017年,美团金融前端遇到了很多通用性问题,特别是在保障前端可用性的过程中,我们团队也踩了不少“坑”,在梳理完这些问题以后,我们还专门做了第31期线下沙龙给大家进行了分享。不管是在面试过程中与候选人讨论&a…

Servlet上传文件和下载文件示例

Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例。 用例 我们的用例是提供一个简单HTML页面,客户端可以在其中选择要上传到服务器的本地文件。 在提…

java创建异步多线程_Java创建多线程异步执行实现代码解析

实现Runable接口通过实现Runable接口中的run()方法public class ThreadTest implements Runnable {public static void main(String[] args) {Thread thread new Thread(new ThreadTest());thread.start();}Overridepublic void run() {System.out.println("Runable 方式…

hive基本操作与应用

通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果放在表word_count里 查看统计结果 转载于:https://www.cnblogs.com/cairuiqi/p/9048256.html

Apache log4j是领先的日志记录框架

根据 从零周转开始的调查中, Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙,占61%。 但是,它似乎最常与Apache Log4j一起使用,52%的调查参与者都…

Centos6.8通过yum安装mysql5.7

Centos6.8通过yum安装mysql5.7 2017年07月13日 14:19:10 阅读数:1067 1.安装mysql的yum源 a.下载配置mysql的yum源的rpm包 根据上面3张图片中的操作下载下来的rpm文件可以通过如下命令获取: wget https://dev.mysql.com/get/mysql57-community-release-e…

Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

一、前言 作为小菜鸟第一次写博客的我还有点小激动,最近开始打算着手写一个属于自己架构。算下来差不多最近花一周多的下班时间了来写这个框架,本来想整体架构开发完成测试完成后才写博客,怕自己没时间或失去动力,就先把自己架构设…

房价在手,天下我有 --反手就撸一个爬虫(终)

接上篇,科科,好,我们继续 我们在这里先把json数据入库吧~ 首先,database/scheme里定义好数据类型。 const mongoose require(mongoose)const detailHouseSchema new mongoose.Schema({ //定义数据模式link:String…

Spring MVC:带有CNVR卷的REST应用程序。 1个

不久前,我阅读了Paul Chapman撰写的有关内容协商视图解析器 (CNVR)的文章。 Spring Framework Blog上的那篇文章启发了我研究这个框架的领域。 因此,我开发了一个基于Spring MVC和CNVR的 REST示例应用程序。 该应用程序演示了REST…

《精通Spring 4.x 企业应用开发实战》学习笔记

第四章 IoC容器 4.1 IoC概述 IoC(Inverse of Control 控制反转),控制是指接口实现类的选择控制权,反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中。 也就是由Spring容器借由Bean配置来进行控制。 DI(D…

微前端——无界wujie

B站课程视频 课程视频 课程课件笔记: 1.微前端 2.无界 现有的微前端框架:iframe、qiankun、Micro-app(京东)、EMP(百度)、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…