HTTPS是网络安全解决方案的一个体现,本文将从网络安全问题的角度来阐述HTTPS设计
网络攻击的几种形式
窃听
此类攻击属于被动攻击,不影响接收方正常接收信息。只是对数据进行观察或分析,并不干扰信息。
篡改
此类攻击属于主动攻击,包括中断报文或伪造报文给接收方。
假冒
假冒主机A向主机B发送消息
其他
其他还有恶意程序、计算机病毒、木马、流氓软件、拒绝式服务Dos等,这些暂时和HTTPS无关,暂不讨论
如何解决以上三种问题呢
窃听
为了防止别人窃听,我们最容易想到的就是加密/解密,使用对称秘钥加密/解密
。
通过加密,在网络上传输的内容变成了XXXX,即使被窃听了,窃听者也无法知道其中内容。除非窃听者知道秘钥K。
看起来似乎解决了窃听问题
但是有一个问题,主机A和主机B怎么协商秘钥K呢?
若通过网络传输秘钥K,那么将回到第一个问题,这个秘钥K可能被窃听,这就变成了一个先有鸡还是先有蛋的过程了。
改进使用非对称秘钥加密/解密
。含有公钥秘钥PK和私钥SK两个秘钥,工作方式为
- 公钥加密,私钥解密
- 私钥加密,公钥解密
- 私钥自己保管,公钥可以共享,也就是公钥可以让所有人知道
通过时序图来简单说明一下通信过程
主机A和主机B直接通过非对称秘钥加密/解密方式通信。在步骤一中,主机B把自己的公钥PK发给了主机A,主机A使用这个公钥加密消息然后发给B,我们可以看出主机A发送消息给主机B是安全的,讨论一下为什么是安全的
- 步骤一,公钥PK可以公开,被截获了公钥PK也没有关系
- 步骤三,消息M被截获,没有私钥SK,可以认为消息也是安全的
同理,如果想让主机B发消息给主机A是安全的,只要让主机A把自己的公钥PK也发给主机B(也使用非对称秘钥加密/解密),重复上述时序图即可
到这里我们可以理解为解决了窃听的问题了
假冒
假如有一台主机Y冒充主机A与主机B通信,也使用主机B的秘钥PK加密,与主机B就可以正常与主机H通信了。这时我们就要借鉴签名,类似于合同签字,从笔记可以证明确实是本人。对应于计算机则为数字签名。数据签名也是使用非对称加密方式实现
由于私钥是唯一的,我们让主机A使用自己的私钥加密消息M,主机B使用主机A的公钥解密消息M,只要能解开消息M,就证明这条消息M确实是主机A发送的,A不能抵赖,因为其他人不知道这个私钥。
数据签名实现流程图
从这个例子我们可以看出非对称加密/解密
,使用公钥和私钥加密的作用不同,引入签名以后,这样就可以防止假冒
同时实现加密通信和签名过程
中间人攻击
我们先来看正常的通信流程,使用加密通信和签名实现
上述通信过程采用了两对非对称加密/解密秘钥(公钥PK1、私钥SK1/公钥PK2、私钥SK2),当存在中间人时,也是不安全的。请看下列流程,假设
中间人也有两对非对称加密/解密秘钥(公钥PK3、私钥SK3/公钥PK4、私钥SK4),主机A(公钥PK1、私钥SK1),主机B(公钥PK2、私钥SK2)
通过流程图,可以看出中间人通过冒充主机A、主机B通信,这里最核心的点是中间人截获了双方的公钥,并伪造了双方的公钥。如何解决这个问题,通过CA证书的签发机构,核心是公钥基础设施(Public Key Infrastructure,PKI),说通俗就是这个公钥是有效的,避免中间人。
篡改
使用信息摘要技术。检验所传送的报文是完整的,没有被他人篡改过。
密码散列函数(英语:Cryptographic hash function)
密码散列函数应该有四个主要的特性:
- 对于任何一个给定的消息,它都很容易就能运算出散列数值。
- 难以由一个已知的散列数值,去推算出原始的消息。
- 在不更动散列数值的前提下,修改消息内容是不可行的。
- 对于两个不同的消息,只有极低的几率会产生相同的散列数值。
MD5/SHA家族
其他的消息摘要算法
使用信息指纹(信息摘要)防止篡改
先看一个简单版本,有缺陷。
如图所示,通过比对信息指纹是否一致,检测报文是否完整。若报文被篡改了,信息指纹肯定不一致了。若完整则通过散列哈希函数计算,数据指纹应该是一致的
下面考虑一种被攻击的情况,如下
消息与信息指纹一起被篡改了
如何防止呢?回到上述的方法,对信息指纹加密,如图
对信息指纹加密,就可以避免了信息指纹被篡改。为什么呢,就算攻击者知道信息指纹值,也无法对其加密,因为接受者一定会使用K对称解密,这个秘钥K,攻击者不知道。如果使用其他秘钥加密,接受者解密不了,一定知道被攻击了。如下图所示,攻击者无法伪造这个过程。
只要秘钥K不丢失,则可以认为此过程是绝对安全的。
总结
窃听、假冒、篡改都使用到秘钥,经过上述三种情况的分析,只要我们保证或信任秘钥是绝对安全的,那我们就认为通信是安全的。接下来将讨论HTTPS设计是如何解决这个问题的。
HTTPS
首先,我们来谈谈秘钥问题如何解决?
数字证书认证机构(CA)
承担公钥体系中公钥的合法性检验的责任,作用:证明是非对称加密/解密中,公钥PK的有效性,下面谈谈具体流程,其中数字证书认证机构作为第三方公证。
我们可以看出,通过CA可以证明主机B的公钥有效。这样我们可以简化一下问题,只要证明CA是安全的,那么所有的秘钥都是安全的。怎么证明呢?
假设我们的证书是图中红色签发的,那么将该证书导入到浏览器中,这份证书由它的上一层帮他证明有效,上一级再由根证书Root CA证明。
下面是HTTPS流程图,理解一下即可,应该没什么问题了
这里解释一下,为什么要通过非对称加密/解密转换成对称秘钥呢,主要是效率问题,非对称加密/解密费时间,不合适