一、概述

在下面的章节,我们要搞明白以下几个问题:

  • HTTP和HTTPS的区别,为什么要使用HTTPS
  • HTTPS如何解决加密问题
  • HTTPS如何避免中间人攻击
  • CA证书是什么
  • CA证书是如何申请和颁发的
  • HTTPS的整体流程

二、HTTP和HTTPS的区别

HTTP是什么:

首先,我们知道HTTP的全名是超文本传输协议,主要是用来供客户端(一般为浏览器)与服务器之间传递WEB数据的一种应用层协议。

而原始的HTTP协议只规定了传输数据包的格式以及互相之间协商好的字段,这些格式和字段是客户端与服务器都能理解的内容。

但是HTTP协议的整个应用层数据包(TCP报文的payload),所有的内容都是明文的。

也就是说,当我们从传输路径中某个位置使用抓包工具或其他手段截取到这个数据包,就能轻松的获取其中的请求和响应内容。

举个例子:

A和B用一种语言对话(例如中文),当黑客C使用手段截取的A和B的谈话内容,他只需要自己会中文或找个会中文的人进行翻译就知道A和B的谈话内容了。

HTTPS是什么:

我们了解了HTTP大概的工作原理,就知道HTTP仅仅实现了一种数据通讯的协议,但是是并不安全的。

而如何让客户端和服务器之间的数据交换变得安全,那么就需要有以下两个措施:

1.传输的数据内容是加密的而非明文的

2.浏览器在访问服务器的时候,能够验证服务器的身份(即我当前访问的服务器就是我想要访问的服务器,而非假冒的),避免中间人攻击(黑客在中间假冒客户端和服务器,两边进行欺骗)

当解决了以上两个问题,那么HTTP就变成了一个安全的传输协议,即我们要学习的HTTPS协议。

举个例子:

A找到B的时候,要求B出示一个证明身份的证件(例如身份证),确认了B的身份后。采用一种黑客无法截取的方式(具体方式在后面详细解释)商议了一个密码本,用来加密要交流的内容。这时A和B的交流内容都通过密码本加密,C截取到也无法解密。

HTTP和HTTPS的区别:

  • HTTP是不安全的,传输内容是明文的,不能确定服务器的真实身份
  • HTTPS是安全的,传输内容是加密的,可以确定服务器的身份

三、HTTPS的加密问题

1.加密相关的几个概念

1)对称加密

概念:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

使用一个公式来描述:

  加密:f(key,data) = X
  解密:g(key,X) = data

data为我们想要加密的内容,key就是对称加密使用的单秘钥,X为加密后的内容。f为加密,g为解密。

常见的对称加密算法有DES、3DES、AES等,目前用得比较多的是AES加密。

2)非对称加密

概念:非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

使用一个公式来描述:

A-->B方向:
  加密:f(pk,data) = X
  解密:g(sk,X) = data
B-->A方向:
  加密:f(sk,data) = Y
  解密:g(pk,Y) = data

假设A是客户端,B是服务器。

当A向B发数据时,A使用公钥(pk)加密,得到加密后的数据X。

B收到X后,使用私钥(sk)解密。

当B向A发数据时,B使用私钥(sk)加密,得到加密后的数据Y。

A收到Y后,使用公钥(pk)解密。

注意:所有能够与B服务器交换数据的客户端都可以持有公钥,而服务器持有私钥(只有服务端B有私钥)。可以参考SSH协议中的私钥和公钥。

常见的非对称加密算法有:RSA、DSA、ECDSA等。

3)HASH散列

概念:HASH散列是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

hash散列有什么作用?

我们一般使用哈希值来比较一个文件或一段内容是否被篡改。例如在我们使用迅雷或其他下载工具下载了一个软件,我们想验证是否下载完整则可以使用它的散列值进行比对,如果一致则下载完整,如果不一致则内容有问题。

常用的Hash散列算法有:MD4、MD5、SHA1、SHA-256等。

2.只使用对称加密的情况

我们在HTTP的基础上让客户端(浏览器)和服务器只使用对称加密,如下图所示:

从图中可以看出,客户端和服务器之间如果只使用对称加密技术,则始终需要商议一个加密用的秘钥(key,例如一个随机字符串)。在这个商议的过程中,黑客就可以介入进行截取,只要黑客获取到这个key,那么后面的对称加密就完全失效了。

3.只使用非对称加密的情况

在HTTP上只使用非对称加密的技术,如下图所示:

可以看到,黑客可以截取到公钥以及之后传输的数据,并可以解密服务器发给客户端的数据,同样存在数据安全的问题。(这里只讨论数据加密的安全问题,中间人攻击在后面讨论)

4.同时使用对称加密和非对称加密的情况

既然只使用对称加密和只使用非对称加密都无法避免数据被黑客截取,那么我们可以将对称加密和非对称加密结合起来使用,如下图:

从图中可以看到,我们使用非对称加密算法来协商对称加密的秘钥key。客户端拿到服务器的公钥后,产生一个随机的key,然后使用公钥对其进行加密,并发送给服务器。

由于公钥加密的内容只有私钥才能解密,也就是说黑客即便截取到了公钥,也无法获取到key。

所以之后的数据使用key进行对称加密是绝对安全的。

从以上过程我们可以看到,使用对称加密+非对称加密的方式可以使黑客无法通过截取的方式来获取数据,看似已经很安全了,但是我们还要讨论一种情况,就是中间人欺骗攻击。

5.中间人欺骗攻击

在第4节的基础上,可能出现以下情况,如图:

黑客在中间充当一个中间人,让客户端以为自己是服务器,让服务器以为自己是客户端。

他使用一套假的非对称加密秘钥来与客户端进行通讯,而使用服务器给的真的公钥与服务器进行通讯,从中将数据解密并重新加密,起到两边欺骗的效果。

那么,如何防范这种中间人欺骗的攻击呢?

那就需要服务器能够证明自己的身份。客户端从服务器拿到公钥的同时,还要能够确定当前通讯的服务器的身份是正确的(从而才能确保拿到的公钥是正确的,使用该公钥加密,只有正确的服务器才能解密)。

四、HTTPS如何避免中间人攻击

为了避免中间人欺骗攻击,需要服务器能够向客户端(浏览器)证明自己的身份。那么如何证明呢?

举个例子,我们去坐飞机、坐火车,在进站的时候需要出示自己的身份证来证明自己的身份。而这个身份证不是随便谁都可以颁发的,而是需要一个权威的机构来颁发,身份证就是我们国家的公安机关来颁发的,并且具有一定的防伪措施(暂时理解为绝对可靠的)。

那么,服务器的身份证是什么呢?答案就是我们下面要讨论的CA证书,而CA证书的颁发机构就相当于公安机关,他是一个互联网行业认可的一些机构(有多家)。下面我们就来了解一下CA证书以及CA机构。

1.CA机构的根证书

CA机构可以对其他公司(服务器所属公司)和提供的web服务(服务器)进行证书签发。而为这些服务器颁发证书需要有一个根证书。

根证书:

概念:根证书是未被签名的公钥证书或自签名的证书。

什么意思呢?即CA认证机构的ROOT证书,实际上就是CA认证机构的相关信息加上他生成的一对非对称加密秘钥中的公钥。如下图:

这个证书中包含CA机构的一个公钥(CPK),还有CA机构的一些明文信息。对应的私钥由CA机构自己妥善保存,用于为其他公司提供的web服务器签发证书时加密签名使用。

当我们认可一个CA机构时,就需要在浏览器中下载安装该机构的根证书,一般浏览器会内置他所信任的CA机构根证书(所以一般不会手动去安装)。

也就是说,我们的浏览器(客户端)中已经有CA机构的根证书了(这个很重要,后面会使用到它),CA机构自己保留着CSK(私钥)。

2.CA证书和申请流程

当一个公司想提供一个HTTPS的服务器,则需要在互联网认可的几家CA认证机构中选择一家来申请CA证书。

首先,我们看一下CA证书的结构(以百度为例):

首先,百度生成一对非对称秘钥(包含公钥和私钥),私钥(SK)自己保存,而公钥(PK)提供给CA机构,同时提供自己公司和提供服务的相关信息。

CA机构收到申请后,大概执行以下操作:

1)对该公司以及服务进行核实,确认是否满足申请条件

2)将公钥和所有其他明文信息使用HASH算法(例如MD5算法)进行散列,得到一个散列值(也叫信息摘要),这个散列值主要用于以后判断信息是否被篡改(例如公钥被篡改,则散列值会改变)

3)将生产的散列值,使用CA机构的私钥进行加密(CSK私钥),得到一个数字签名

4)将百度提供的公钥、信息、数字签名形成一个CA证书,颁发给百度,放到服务器中

3.浏览器从服务器获取证书

此时,浏览器在与服务器建立HTTPS连接的时候,服务器会将CA证书发送给浏览器。

浏览器拿到这个CA证书后,会做如下操作:

1)先查看CA证书中关于CA机构的信息,然后从浏览器安装的根证书中找到对应的CPK(如果没有,则提示证书有问题)

2)使用CPK对数字签名进行解密,得到HASH散列值(摘要)

3)使用与CA机构相同的HASH算法(例如MD5)对CA证书中的PK和明文信息进行HASH散列,得到自己算出来的散列值

4)对比解密得到的散列值与自己计算出来的散列值是否相同,如果相同则认为CA证书没有被篡改过,如果不相同,则提示证书有问题

5)在CA证书无误的情况下,证书中的PK(即百度的公钥)也是合法可用的,后面就可以使用这个公钥来加密key了(对称加密的秘钥,或秘钥的一部分)

这里其实已经回答了如何避免中间人欺骗攻击这个问题了:

  因为如果中间人修改了CA证书中的PK或其他任何信息,那么客户端计算出的HASH值一定和解密出来的HASH值不一样(或无法解密)。

五、HTTPS的整体流程

既然已经搞清楚了CA机构、CA证书、对称加密、非对称加密、HASH散列,那么我们将其流程窜起来就是HTTPS的工作流程了,如图:

流程解析,前提是已经建立了TCP连接:

1)客户端向服务器发送Client Hello,其中包含一个随机数1(Random1),还有客户端支持的加密方式(一个列表),如下所示:

2)服务器返回Server Hello,包含random2随机数,和选定的加密方式,如下所示:

3)服务器发送CA证书给客户端,如下所示:

4)验证证书合法性,即解密数字签名,计算HASH值,然后进行对比

5)验证通过后,客户端生成一个random3随机数,并连同random1和random2(之前通讯时发送给服务器的random1,以及服务器发送给客户端的random2),计算出一个key值(就是后面进行对称加密用的key)。

6)使用CA证书中的PK,对random3进行加密(key的一部分,并非key本身,因为黑客也可能拿到证书中的PK),并发送给服务器。

7)服务器收到加密后的random3,使用SK(证书中公钥PK对应的私钥,在百度服务器上保存着)解密,得到random3。

8)同样使用random1、random2和random3计算一个key值,计算方式是大家协商好的,所以计算出的key值和客户端计算出的key值应该是一样的。这个key就是对称加密使用的秘钥。

9)客户端通过key对数据进行加密,发送给服务器,服务器使用key解密数据。

10)服务器通过key对数据进行加密,发送给客户端,客户端使用key解密数据。

至此,整个HTTPS的大体流程就完成了,本文并未对特别细节的地方做描述,只是希望能够将自己的理解形成通俗易懂的文字,供大家参考。明白了工作原理,要研究细节部分就很容易了。

===

[安全] HTTPS的理解的更多相关文章

  1. https 的理解

    前言: 本篇博文来记录下对http及https的理解.(会有点 杂,补缺补漏) 引用:https://blog.csdn.net/u011109589/article/details/80306479 ...

  2. 公钥与私钥对HTTPS的理解(数字证书的需要)

    本文转自某大牛链接 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下window ...

  3. HTTP与HTTPS的理解

    最近一直也在面试的过程中,可能由于各个方面的问题,导致没有时间抽出更新博客,今天开始陆续更新!!!以后自己的博客,会向React Native,swift ,以及H5延展,成为一个全栈的技术人员.本篇 ...

  4. HTTPS深入理解

    HTTPS = HTTP + TLS

  5. 报文、http、https的理解

    一.何为报文?     报文是网络中交换与传输的数据单位,即站点一次性要发送的数据块.报文包含了将要发送的完整的数据信息,其长短不一致,长度不限且可变. 二.报文的作用     报文多是多个系统之间需 ...

  6. charles刷分微信跳一跳小程序对https的理解

    以前以为只要安装了https 客户端与服务端的数据会被加密就安全了 事实上 只要任意一款抓包工具 并伪造证书  就可以解密这个被所谓https加密的数据 如  可以下载charles的根证书  作为伪 ...

  7. 简单说一下你对http和https的理解

    http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...

  8. HTTP 与HTTPS 简单理解

      HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因 ...

  9. 如果这样来理解HTTPS,一篇就够了!

    1.前言 可能有初学者会问,即时通讯应用的通信安全,不就是对Socket长连接进行SSL/TLS加密这些知识吗,干吗要理解HTTPS协议呢. 这其实是个误解:当今主流的移动端IM数据通信,总结下来无外 ...

随机推荐

  1. Java—线程池ThreadPoolExecutor详解

    引导 要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程: 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题.如果不使用线程池,有可能造成系统 ...

  2. 一步步打造QQ群发消息群发器

    最近为了做公众号号推广,吸粉,然后加了几百个QQ群,感觉QQ群的群发效果还是不错的,一天能捞到100个粉丝左右,好的时候也有200个,少的时候几十个,但是由于太多的群了,手工一个个点击开来群发,几百个 ...

  3. Java 设置PDF中的文本旋转、倾斜

    本文介绍通过Java程序在PDF文档中设置文本旋转.倾斜的方法.设置文本倾斜时,通过定义方法TransformText(page);并设置page.getCanvas().skewTransform( ...

  4. uCOS2014.1.10

    uC/OS-Ⅱ任务的结构有两种:一种是无限循环结构:另一种是只执行一次的程序结构.若采用只执行一次的程序结构,就要用任务删除函数来实现. uC/OS-Ⅱ进行任务的管理是从调用启动函数OSStart() ...

  5. Spring Cloud 系列之 Bus 消息总线

    什么是消息总线 消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费. 消息代理又是什么?消息代理是一个消息验证.传输.路由的架构模式,主要用来 ...

  6. java项目部署Linux服务器几种启动方式总结经验

    一:两种部署包: 部署之前先说下两种包,java项目部署到服务器一般有用war包的,也有用jar包的,微服务spring-cloud普及后大部分打包都是jar,部署之前先搞清楚自己要打war包还是ja ...

  7. 瞬间教你学会使用java中list的retainAll方法

    retainAll方法简介 当我们有两个list集合的时候,我们可以使用retainAll方法求得两个list集合的子集.retainAll是Collection接口中提供的一个方法,各个实现类有自己 ...

  8. Javascript模块化编程-require.js

    转自:https://www.cnblogs.com/digdeep/p/4607131.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成"互联网应用程序&quo ...

  9. Redis数据类型简介(十分钟快速学习Redis)

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  10. k8s big-ip control 安装使用

    k8s big-ip control 安装使用 0. 准备工作 网络打通,这里没有使用fannel,没有使用vxlan . 在f5界面 创建f5分区.这里是cce-test. 1. 安装bigip c ...