虽然现在许多网站都会用到HTTP和HTTPS,但是大家极力倡导使用的却是更为安全的HTTPS,今天我们就来了解一下HTTPS是如何保证数据传输的安全性的。本篇概要:1.HTTP的缺点2.HTTPS如何保证数据安全性3.对称加密和非对称加密4.HTTPS的请求过程5.如何防止数字证书被篡改6.单双向认证
1
为什么说HTTP不安全?
HTTP本质上就是一个TCP连接,只不过协议规定了使用80端口,以及发送命令或数据的格式,而TCP本身是没有加密的功能。致命的是,HTTP在数据传输过程中,数据就是以明文的方式传输的,由于数据没有被加密,所以很容易出现数据窃听、篡改或者是身份伪造的不安全的行为。
有什么优化的方法?
既然使用明文进行数据传输不安全,那我们可以尝试一下对数据进行加密处理。比如,通信双方可以约定一种算法,首先将需要发送的数据按照一定的规则进行加密,然后对方接收到消息后按照相同的规则进行解密。这个就是对称加密的体现形式了。
所谓对称加密,即原文和密文可使用一个相同的密钥进行加密和解密,即使用同一把密匙对原文加密得到密文或者是对密文解密获取到原文。其优点是加密解密效率较高。但是使用对称加密有一个关键点,那就是这个对称密钥,应该如何来确定呢?在HTTP请求中,加密密钥协商,还是个难题。
2
HTTPS如何保证数据安全的呢?
在HTTPS数据传输过程中对数据进行加密处理,HTTPS是使用对称加密和非对称加密、签名算法(签名算法不是用来做加密的)以及证书机制来对消息进行处理,以此达到一个安全的有效传输。HTTPS是基于HTTP的上层添加了一个叫做TLS的安全层,对数据的加密等操作都是在这个安全层中进行处理的,其底层还是应用的HTTP。HTTPS通信先是使用非对称加密进行密钥的协商,协商出一个对称加密的密钥,之后的通信则采用这个对称密钥进行对称加密密文传输。因为非对称加密其算法极其复杂,导致解密效率低下,而对称加密效率则明显高出百倍。在上面我们提到过,对明文使用同一把密钥进行加密和解密是属于对称加密。那么非对称加密又是怎样的呢?,非对称加密
非对称加密,即原文加密和密文加密使用的是两个不同的密钥,一把称之为公钥,一把称之为私钥,使用公钥加密的内容可以通过私钥进行解密,同样,使用私钥加密的内容使用公钥可以进行解密。公钥和私钥是相对而言的,通常而言,保留在己方不对外泄露称之为私钥,可公布公开的称之为公钥。
非对称加密对明文进行加密和解密是使用的不同的密钥。但是,我们在上面提过,在使用加密时,其难点就在于密钥协商过程,那么,HTTPS是如何处理这个密钥协商过程呢。
在这里,我们需要引入一个新的名词:数字证书。
数字证书
所谓数字证书,就是一份类似于身份证一样的网络通信凭证,以证明所请求对象的身份信息不被篡改并且是真实有效的,当我们请求某个网站时,先去请求网站的数字证书,然后检查证书的真实性和有效性,从而一步步进行身份验证,具体过程会在后面进行图解。
所谓证书,就是服务端从网站公证处备案申请的一个身份证这样的一个东西,里面包含有有效期开始时间、结束时间、证书持有人、签名以及最关键的持有人的公钥信息等。通常情况下,我们会为服务端配置SSL证书,SSL证书是数字证书的一种,由受信任的数字证书颁发机构(简称CA)颁发,具有服务器身份验证和数据传输加密的功能。就好比我们访问亿佰特网站,我们怎么知道我们访问的亿佰特网站是否是一个假的呢,所以我们通常在访问时,先去获取对方网站的证书信息,然后和本地浏览器载入的证书进行比较看是否是安全的。HTTPS通信在客户端请求服务端时,先去获取服务端的证书,然后将证书在本地进行对比校验(通常浏览器中会内置很多证书,如上图);当验证通过时,则表示是一个安全的证书,否则浏览器状态栏会提示“不安全”。
3
HTTPS的请求过程
在上面我们简单介绍了一下HTTPS和数字证书,但是它们是如何来解决HTTP中存在的数据窃听、数据篡改、身份伪造问题的呢?上图是HTTPS简单的请求模型,使用这个模型可以完美的解决上面提到的三个问题点。
在第一次请求时,客户端先去请求服务端的数字证书,并且生成一个随机数R1,将随机数和自己支持的加密算法告诉服务端。服务端收到客户端的请求后,选择双方共同支持的加密算法,并且生成新的随机数R2,将服务器的数字证书及加密算法、随机数一并返回给客户端。
客户端收到服务端的数字证书,然后使用浏览器内置的CA证书进行解密获取到证书中的服务端的公钥及服务端的认证信息,从而确保证书没有被人篡改过。然后生成新的随机数R3,使用服务端的公钥对随机数R3进行加密后返回给服务端并将随机数R1、R2、R3组合成一串密钥用作对称加密用。
服务端收到客户端加密后的随机数R3,使用自己的私钥对密文进行解密获取到随机数R3,组合R1、R2、R3获取到一串密钥(和客户端一致);然后开始使用对称加密进行通信。上述就是HTTPS对密钥协商的过程,由于非对称加密一方密匙加密后只能使用另一方密匙解密,所以在前两次数据传输中即使被窃听也不怕,因为在第三次传递随机数R3时是使用公钥加密的,只有服务端的私钥才能解密,从而确保密钥的安全性。
4
如何防止数字证书被篡改
在上面的请求模型中,如何防止客户端返回的数字证书被篡改呢?我们在申请数字证书时,会提供我们的基本信息以及企业域名信息等,证书颁发机构CA会根据证书中的这些信息以及所提供的签名算法对内容进行摘要,得到一个消息摘要(散列hash串),即使用Hash算法获取到的一个唯一标识,然后CA机构会使用自己的私钥对摘要进行加密,获取到一个密文,即数字签名,也叫做指纹;表示其唯一性。然后证书颁发机构对整个明文数字证书使用证书颁发机构CA自己的私钥进行加密,得到数字证书。当数字证书中的内容被篡改时,使用Hash算法对内容进行计算获取到新的摘要,只需要对比一下两个摘要是否相同即可知道证书中的数据知否有被篡改。
当客户端请求数据从浏览器端获取到数字证书后,通过浏览器内置的CA证书中的公钥对数字证书进行解密,获取到明文数字证书(包含企业基本信息及服务端公钥以及数字签名),通过如上图所示方式来判断证书是否有被篡改。
单双向认证
在上面的例子中,客户端请求服务端获取证书信息进行认证,这个就是单向认证,只是客户端认证服务端,但是服务端并没有认证客户端的请求。HTTPS支持单向认证,也支持双向认证。
双向认证的情况通常比较少见,常见于银行等领域,就像我们以前使用银行的U盾,这就是一种双向认证案例,还有就是在电脑上安装支付宝的证书等;双向认证比单向认证更加安全,但是需要对每一个客户端都进行分配证书。