在HTTP协议中,全部报文的发送、接收都是以明文的形式进行的。也就是说,在TCP/IP五层网络模型中,数据直接以明文的形式从应用层(HTTP)发送给传输层(TCP),之间没有任何加密过程,以下图所示:算法
这将带来如下三大风险:安全
一、窃听/嗅探风险服务器
中间人能够截获客户端、服务器之间的通讯数据,一览无遗。网络
二、数据篡改风险dom
中间人截获数据以后,能够对数据修改以后再发生给对方。工具
三、身份伪造风险ui
因为网络通讯自己的特殊性,通讯双方没法具体识别对方的身份,中间人可趁机而入。加密
那么,针对上面的三大风险,咱们有什么样的对策吗?有的。code
一、针对窃听/嗅探风险,咱们能够对数据使用密码加密算法进行加密,即便中间人截获了咱们的数据,因为没有相应的解密密钥,拿到了数据也无法破解。cdn
二、针对篡改风险,咱们可使用相关的数字签名算法,保障数据的完整性。
三、针对身份伪造风险,咱们能够经过颁发数字证书来证实对方的身份。
固然了,并非说HTTP协议自己就必定存在上面的三大风险,咱们也可使用HTTP协议,在数据传输以前对数据进行加密或者数字签名,一样也能够最大程度避免窃听和篡改风险,可是并不能杜绝,由于没有绝对地安全。
SSL/TLS 和 HTTPS 协议联系很是紧密,HTTPS 是在 SSL/TLS 协议基础之上创建起来的。
能够这么理解,HTTPS 中的 S ,指的就是 SSL/TLS 协议自己。
上面简单总结了关于SSL/TLS协议的发展历程,更加详细的了解,能够参阅维基百科传输层安全性协议 。SSL协议是TLS协议的前身,是SSL协议的改进版本。
SSL/TLS协议位于应用层和传输层之间,用于对上层数据包加密以后传输,同时进行身份、数据完整性校验。
简单地讲,SSL/TLS就是同时结合各类密码算法、数字签名算法及数字证书等技术的一套协议,目的就是为了保证通讯的安全性。
采用SSL/TLS协议,通讯双方创建链接以前须要进行握手,目的是协商出会话密钥,用于后续对通讯数据的加解密操做。
加密算法分为两大类:
一、对称加密算法
数据加解密使用同一份密钥,加解密速度快,效率高,缺点是密钥的管理难度大,一旦密钥传输泄露,那就没啥用处了。
二、非对称加密算法
数据加解密使用公钥和私钥,公钥用于传输,私钥本身保存,安全性较高,但加解密速度偏慢。
而SSL/TLS则结合二者的优缺点,数据包的加密使用对称加密算法,而对称加密算法的密钥采用非对称加密手段协商获取。
经常使用的对称加密算法有:DES、3DES、Blowfish、IDEA、RC四、RC五、RC6和AES
经常使用的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
经常使用的数字签名算法有:MAC、MD五、SHA1
下面使用Wireshark
抓包工具简单分析下HTTPS协议的握手过程,以访问百度为栗:https://www.ifeng.com
首先咱们要知道握手的目的就是为了解决上面的三大风险,即协商出对话密钥,验证数据完整性、身份认证等。
从上图大体能够总结出握手的基本流程:
Client Hello
Server Hello
Certificate
Server key change,Server Hello Done
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
Change Cipher Spec, Encrypted Handshake Message
下面具体分析每一步的详细内容:
Client Hello
中携带了什么信息呢?Client Hello
中携带了当前客户端支持的TLS协议的版本号(Version)、客户端支持的加密套件(Cipher Suites)、一个随机数、客户端支持的压缩算法(Compression Method)
Server Hello
中又返回了什么信息呢?第一步客户端告诉服务端我所支持的相关信息,第二步服务端协商返回肯定的信息,如肯定使用哪一种加密套件(Cipher Suites)或压缩方法等。
这些参数后期客户端能够算出会话密钥,若是使用的是RSA算法,那么这一步是不须要的。传递完参数以后,告诉客户端服务器端的握手结束(Done)了。
这一步,客户端根据第四步传过来的公钥,生成一个叫预备-主密钥的pre-master key
,而后Client Key Exchange
将这个预备-主密钥传给服务器端。服务器端结合本身的私钥解出这个预备-主密钥的信息,获得第三个随机数,因此,到目前为止,客户端和服务器都拥有 Random1 + Random2 + Random3。
紧接着两边根据D-H算法及第四步传递的相关参数生成一个会话密钥
,后续就使用这个密钥进行通讯了。能够看出,会话密钥能不能被破解,关键看第三个随机数能不能被破解,并且第三个随机数用wireShark是抓取不到的。
Change Cipher Spec
这一步是告诉服务器端后期的通讯都会使用咱们协商出来的密钥进行通讯。
Encrypted Handshake Message
是客户端将前面的握手消息生成摘要再用协商好的秘钥加密(对称加密),这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来讲明前面协商出来的秘钥是一致的。
同第5步,若是服务器端经过D-H算法可以解密摘要,那么服务器端应该告诉客户端说咱们之间协商的会话密钥
是一致的。
以上是小编对SSL/STL、HTTPS的简单理解,更全面的知识,可自行查阅RFC相关规范文档。因为小编学识尚浅,若有不正确的地方,请指出,谢谢!