HTTP存在的问题
以下均是客户端http请求一次服务端可能出现的问题,即服务端向客户端响应请求,返回数据:
1. 明文传输,内容不加密:个人隐私、账户密码等信息可能会被盗取。
2. 篡改,数据的完整性和安全性:收到的数据可能被第三方修改过,或被植入广告等。
3. 假冒,服务端的身份未认证:访问的站点非目标服务器站点,如域名欺骗、域名劫持、钓鱼网站
HTTPS解决HTTP存在的问题
1. 利用非对称加密算法和对称加密算法加密(客户端随机生成的密钥来对称加密明文)
2. 服务端是真实、合法的目标服务器(数字证书)
3. 数字证书完整性和真实性(数字签名)
密码学基础
在正式讲解HTTPS协议之前,我们首先要知道一些密码学的知识。
明文
明文指的是未被加密过的原始数据。
密文
明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全;
密文也可以被解密,得到原始的明文。
密钥
密钥是一种参数,它是在明文与密文相互转换的算法中输入的参数;
密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
对称加密
对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据;
对称加密的特点是算法公开、加密和解密的速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下:密文 + 解密算法 + 私钥 => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因;
由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
非对称加密
非对称加密也叫做公钥加密;
非对称加密与对称加密相比,其安全性更好;
对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解;
而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现;
公钥加密的内容需要用私钥解密,私钥加密的内容需要用公钥解密!
私钥由服务器自己保存,公钥发送给客户端;
公钥指的是公共的密钥,任何人都可以获得该密钥;
被公钥加密过的密文只能被私钥解密,过程如下:
明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文
由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)等。
HTTPS通信过程
HTTPS协议 = HTTP协议 + SSL/TLS协议;
在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的;
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议,SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL,其最新的版本是3.0;
TLS的全称是Transport Layer Security,即安全传输层协议,最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本;
在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作;
虽然TLS与SSL3.0在加密算法上不同,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密;
数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输;
总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
过程如下图所示
HTTPS在传输的过程中会涉及到三个密钥:
服务器端的公钥和私钥,用来进行非对称加密,加密客户端密钥
客户端生成的随机密钥,用来进行对称加密,加密数据
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步
1.客户端向服务器发起HTTPS请求,连接到服务器的443端口
2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
3.服务器将自己的公钥发送给客户端。
4.客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续;严格的说,这里应该是验证服务器发送的数字证书的合法性,客户端如何验证数字证书的合法性,通过CA机构(数字证书就是服务端从CA机构或取得);如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分;然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
7.然后服务器将加密后的密文发送给客户端。
8.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
数字证书通过数字签名保证真实性
数字证书是怎么来的呢?
CA机构就是数字证书颁发的权威机构,负责颁发证书以及验证证书的合法性。如果服务器需要做个有身份的服务器,就需要向CA机构提交申请,当然有钱才好办事,交钱才能给你办证……
服务器向CA机构提交申请,需要提交站点的信息如域名、公司名称、公钥等等,CA审批无误之后就可以给服务器颁发证书了!
客户端在拿到服务器的证书后,就需要验证证书编号是否能在对应的CA机构查到,并且核对证书的基本信息如证书上的域名是否与当前访问的域名一致等等,还可以拿到证书中服务器的公钥信息用于协商对称密钥!
证书颁发了,可是又怎么防止伪造,怎么保证在传输过程中不被篡改呢?万一小王截获到数字证书,把公钥改成自己的那不是依然无法保证安全了么?这就需要数字签名了!
服务器在与客户端通信的时候,就会将数字证书和数字签名出示给客户端了;
客户端拿到数字证书和数字签名后,先通过操作系统或者浏览器内置信任的CA机构找到对应CA机构的公钥对数字签名进行解密,然后采用同样的摘要算法计算数字证书的摘要;
如果客户端自己计算的摘要与服务器发来的摘要一致,则证书是没有被篡改过的!这样就防止了篡改!第三方拿不到CA机构的私钥,也就无法对摘要进行加密,如果是第三方伪造的签名自然也在客户端也就无法解密,这就防止了伪造!
所以数字签名就是通过这种机制来保证数字证书不被篡改和不被伪造。
参考来源
http://www.17coding.info/article/22
https://www.jianshu.com/p/14cd2c9d2cd2