这是我参与8月更文挑战的第25天,活动详情查看: 8月更文挑战
HTTPS介绍
HTTPS在现在的网站中用的比较多,比较常见的百度,淘宝,阿里,京东等网站访问都采用的是HTTPS协议,在面试中,面试官也比较喜欢问HTTPS的加密相关的原理,反正我在面试的时候都被问到过一次,当时并没有去了解,当时就没有答出来。在原来做微信小程序开发的时候,微信就要求小程序的后端域名访问必须为HTTPS。那么HTTP和HTTPS有什么区别,以及HTTPS的安全是如何保证的,接下来就一一分析。 http又叫超文本传输协议,是一个基于请求与响应,无状态的应用层协议,基于TCP/IP 协议传输文本,但是在传输的时候就存在一个致命的缺点,那就是文本是明文传输的,容易在传输过程中被挟持,然后串改里面的相关内容,为了传输文本的安全,就有了HTTPS协议,HTTPS协议是基于HTTP协议,保证文本传输过程的安全性。 HTTPS协议简单理解就是HTTP协议的升级,在HTTP的基本上增加了数据加密,在传输的时候先对需要传输的文本内容进行加密后,再将加密后的密文发给服务端,服务端在收到密文后,先对密文进行解密,然后在进行后续的业务逻辑操作。
HTTPS加密原理
从上面的图可以看出来HTTPS协议比HTTP协议多了一层安全层SSL/TLS,可以简单的理解为:HTTP + SSL/TLS = HTTPS,相当于对HTTP加了一把锁,客户端与服务端之间的秘钥就相当于锁的钥匙。先简单的理解下:SSL/TLS 是干什么用的。先百度百科下SSL的介绍:
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。【百度百科】
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。【百度百科】
要实现加密与解密的过程,应该需要五部分来组成:明文、密文、秘钥、加密、解密,这五部分构成了一个环。
可以看出秘钥在这其中起了一个非常重要的角色,其中加密算法也比较关键,先了解一下比较常用的加密算法。
加密算法
对称加密
对称加密也叫作单钥加密,指加密和解密用的秘钥是一样的,它的主要优势是:加密,解密运算速度快,效率比较高。发送端和接受端都对数据进行加密然后两端用相同的秘钥对数据进行加减密,可以保证数据的安全。 常用算法:AES、DES、RC4,3DES 、Triple-DES, RC2
非对称加密
非对称加密与对称加密不同点是用的秘钥不同,非对称加密加密和解密用的秘钥是不同的,称为公钥和秘钥,公钥的算法是公开的,私钥存放在服务端是保密的。非对称比对称加密的安全性还高,属于超强级别,但是非对称加密算法性能比较低,对于加密与解密花费的时间比较久,对于加密的数据长度也有限。 常用算法:RSA、DSA、ECDSA、 DH、ECDHE 对称加密与非对称加密各有各自的优缺点,HTTPS就将两者的结合起来用,采取各自的有点来发挥最大的作用 **
散列算法(哈希算法)
散列算法是单向的,对于不同的加密信息生成的密文是不同的,相同的信息生成的密文一直,对于生成的密文是没法反向获取加密的密文信息(排除暴力破解),可以将任务长度的信息转换为较短的固定长度的值,比如MD5,就将认为加密的信息生成32位。 针对散列算法用的比较多的就是我们在官网下载软件的时候,都会附上对应的MD5值,我们可以将下载的软件做一下MD5值,然后跟官网提供的MD5值做个比较,如果值不一样则代表改软件被人恶意串改,不是官方提供的软件,存在安全性问题。 常用算法:MD5、SHA-256
HTTPS协议加密解密过程
HTTPS请求过程描述:
- 客户端向服务器端发送请求,服务端响应客户端的请求,这期间采用明文传输,服务端给客户端响应证书信息(版本信息、加密算法、随机数)等信息;
- 客户端收到服务端响应的证书,验证证书的有效性(找CA机构),验证证书失败则认为证书错误,弹出提示给用户;验证证书成功后继续后面的操作;
- 客户端确认证书没问题后,然后生成一个新的46字节随机数,通过服务器端给的数字证书的公钥加密这个随机数,发生给服务端;
- 服务端收到密文后,采用自己存放的私钥解密密文,获取客户端发生的随机数,作为后续对称加密的key
- 在客户端与服务端验证完成后,后续发送数据采用对称加密方式传输数据
在整个交互工程中,共发送了三个随机数:
- 客户端给出协议版本号,一个随机数(client random),以及客户端支持的加密方式
- 服务端确认双方使用的加密方式,并给出数字证书给客户端,服务器生成一个随机数(server random)
- 客户端确认证书没问题后,然后生成一个新的46字节随机数(premaster secret),客户端根据之前的(client random) + (server random) +(premaster secret)生成后面用的对称秘钥( session key ),然后使用证书的公钥进行加密,同时利用协商好的HASH算法,把加密的密文获取HASH值,最终将:(premaster secret),后面通信的对称加密密文,加密的密文HASH值 都一同传给服务。
在这次客户端共像服务端发生3个数据:
- ( session key ) = (client random) + (server random) +(premaster secret) 使用证书公钥加密的密文
- 加密的密文 的HASH值
- (premaster secret)
- 服务器端收到客户端传来的数据后
- 根据HASH算法先验证加密的密文是否正确(采用相同的HASH算法得出HASH值与客户端传入的HASH值比较)
- 使用私钥解密出密文的内容,验证premaster secret 是否与客户端发送的一致
- 数据验证没问题后,使用( session key )采用对称加密算法加密一段握手消息,然后将握手消息和HASH值返回给客户端
- 客户端收到握手消息及HASH值后,解密握手消息,比较HASH值后认为一致,则握手结束,开启后面的数据传输
** 客户端与服务端进行交互的时候,通过非对称加密方式来获取后面数据传输加密的秘钥,然后用获取到的秘钥采用对称方式来传输数据,很好的将对称加密和非对称加密有点整合在一起使用。 **