[安全] HTTPS的理解

Posted leokale-zz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[安全] HTTPS的理解相关的知识,希望对你有一定的参考价值。

一、概述

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

  • 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的理解的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段

为啥基于锁的程序不能组成正确的线程安全片段?

金蝶handler中 collection 代码片段理解

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何理解这段代码片段中的两对括号?

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)