不安全的Http
Http作为应用层的协议,基于TCP,进行明文传输,数据没有加密
- 容易被窃听,数据没有加密,容易被理解
- 容易被篡改,截取http报文后进行修改,发送到目的地
- 容易被伪造,伪造成真正的网站
Https,全称为Http over TLS/SSL,解决了以上三个问题,主要方法是:
- 数据加密:使用加密算法传输数据,被截获后无法被理解
- 数据摘要:使用摘要算法得到数据的摘要,接收方通过摘要验证
- 数字证书:使用数字证书验证服务端的身份
加密算法
加密算法分为两大类
- 对称加密:加解密使用同一把密钥
- 非对称加密:加解密使用不同的密钥,一般是公钥加私钥
对称加密
凯撒密码
较为简单的对称加密算法,对英语文本进行加解密,主要思想就是将明文中的每个字母按照字母表所在位置右移K位,得到密文
例如:如果K是2,a将会被c替换
这种方式的缺点是每个字母经过加密后只有唯一的密文表示,如果收集了很多数据,就能够破解加密手段
更好的方式是才用多个凯撒密码K轮训进行加密,例如位置为奇数的字母使用K为2加密,位置为偶数的字母使用K为3加密
分组加密
凯撒密码只能够加密英文文本,如要加密所有字符,可以使用分组加密
任何字符的实际存储形式都是0/1字符串,可以将数据按照K bits进行分组,每个分组通过一个一对一的映射表进行加密
为了增加破解的难度,也可以才用多个映射表,轮训队数据进行加密
常用的对称加密算法有
- DES
- 3DES
- AES
都是分组加密算法
非对称加密
加密和解密的要是不同,分别是公钥和私钥
- 公钥加密只能用私钥解密
- 私钥加密只能用公钥解密
- 公钥对外公开,私钥只能自己知道
- 公钥可以由私钥生成,反之不行
通信双方中,A可以将公钥发送给B,B用公钥加密数据后,即使数据被截获,由于私钥只有A有,所以只有A才能知道具体的信息
具体的算法参考
RSA算法原理(一)
RSA算法原理(二)
混合加密-Https的加密方式
使用对称加密的前提是,通信双方需要商量出一个密钥,这个密钥的传递过程也需要是密文传输,如果密钥被截获,即使对数据进行了加密,黑客也可以通过密钥进行破解
非对称加密解决了对称加密的密钥泄露问题,但是非对称加密非常慢,很影响性能,而对称加密非常快,所以HTTPS采用了混合加密方式,使用非对称加密传递密钥,对称加密传递数据
这个密钥被称为 **会话密钥**
- 会话密钥使用非对称加密算法传输,非常安全
- 数据通过对称加密算法传输,非常高效
摘要算法
也叫做哈希算法,输入为任意数据,输出为固定长度的字符串(摘要)
- 不可逆,无法通过输出得到输入
- 相同的输入必然得到相同的输出
- 不同的输入有可能会产生相同的输出
- 无论输入的数据的格式,输出摘要的格式固定不变
例如,将数据的比特流每 8 个比特进行分组(不足的补零),然后将所有分组进行按位异或运算,那么生成的结果就可以称为摘要
如果两个不同的输入得到了相同的输出,就叫做哈希碰撞,越好的摘要算法出现哈希碰撞的概率非常低,常用的摘要算法有
- MD5
- SHA-1
- SHA-256
Https中的摘要算法
为了防止数据在中途被截取,进行篡改或者破坏,发送方会根据摘要算法得到数据的摘要A,将摘要和数据一起发送
接收方通过相同的摘要算法得到数据的摘要B,然后将A和B进行对比,如果不一致就说明数据被篡改了
但是黑客也可以又篡改数据又篡改摘要,接收方就无法判断了。所以发送方和接收方之间必须有一个两者知道的密钥,就像会话密钥一样,为了安全性,不会复用会话密钥,而是使用了一个新的密钥,叫做鉴别密钥,获取方式与会话密钥一样
使用鉴别密钥后,发送方对 数据+鉴别密钥 得到摘要A,并且传输数据和摘要A,接收方收到数据后,对 数据+鉴别密钥 得到摘要B,将A和B进行对比就可以判断数据是否被篡改
摘要A有一个专用名字,叫做报文鉴别码,简称MAC
数字证书
客户端如何保证与他交流的服务端是真的服务端?
典型的中间人攻击问题
- 客户端发送的请求被中间人劫持(DNS劫持),所有请求均发送给中间人
- 中间人假装自己是正规网站,向客户端返回自己的公钥2,并获得正规网站的公钥1
- 客户端使用公钥2加密会话密钥1发送给中间人,中间人通过私钥2解密得到会话密钥,并假装自己是客户端,使用公钥1加密会话密钥2发送到正规网站
至此,客户端和正规网站均认为会话密钥已经交换结束,然后开始数据传输
- 客户端使用会话密钥1对数据进行加密,发送给中间人
- 中间人使用会话密钥1对数据进行解密,得到明文数据,进行篡改
- 中间人使用会话密钥2对数据进行加密,发送给正规网站
客户端需要知道通信另一方的公钥是来自于正规网站并收到认可的,所以就需要数字证书
数字证书需要向认证中心进行申请,并且收费
申请流程如下
- 正规网站生成一对公钥和私钥,将域名、申请者、公钥等信息整合在一起,生成
csr文件,将此文件发送给CA - CA收到申请后,通过各种手段验证申请者的信息,没有异常后,使用摘要算法对
csr文件中正规网站的信息进行摘要,然后再用CA的私钥对这个摘要进行加密,得到一串密文,也叫做数字签名 - 然后CA将
**数字签名**和csr文件中的**明文信息**打包为数字证书,把证书返回给正规网站
改进后的客户端服务端交流方式如下
- 客户端会要求服务器发送数字证书
- 客户端收到证书后,使用自身携带的CA机构的公钥解密其中的签名,得到摘要1,然后通过摘要算法得到证书中的明文信息的摘要2
- 对比摘要1和摘要2,如果一样说明证书是合法的,也就是证书中的公钥是得到CA机构认证的
电脑操作系统中会内置这些认证中心的公钥,无需担心公钥被伪造的问题
一些常见的抓包工具例如Fiddler、Wireshark和Charles,想要抓取Https的包并翻译为明文,也需要往操作系统安装证书,作为一个安全的中间人
SSL/TLS
- Https通过混合加密算法解决Http传输数据被窃听的问题,使用会话密钥
- Https通过摘要算法解决Http传输数据被篡改的问题,使用鉴别密钥
- Https通过数字证书解决Http协议中身份被伪造的问题,客户端验证服务器的证书
在Https中,在TCP协议握手后,在SSl/TLS协议握手中进行会话密钥、鉴别密钥的协商,以及验证证书的合法性
注意SSL/TLS四次握手也是明文的
第一次握手
客户端向服务器发起加密通信请求,内容包括
- 客户端支持的SSL/TLS协议版本,例如TLS1.2版本
- 客户端产生的随机数A,用于后续生成会话密钥和鉴别密钥
- 客户端支持的密码套件列表,每个套件包括
- 用于传输会话密钥的非对称加密算法,如 ECDHE、RSA
- 用于验证数字证书的非对称加密算法,如 ECDHE、RSA
- 用于传输数据的对称加密算法,如 AES_128_GCM、AES_128_CBC
- 用于验证报文完整性的摘要算法,如 SHA256、SHA384
- TLS_非对称加密算法_非对称加密算法_对称加密算法_摘要算法,如果两个非对称加密算法一致,可省略不写。
具体抓包如下
第二次握手
服务器收到加密通信请求后,向客户端发出响应,内容主要包括
- 确认的SSL/TLS协议版本,如果不支持,关闭加密通信
- 服务器产生的随机数B,用于后续生成会话密钥和鉴别密钥
- 确认的密码套件
- 服务器的数字证书
具体抓包如下
第三次握手
客户端收到服务器的回应,并且验证数字证书合法后,进行第三次握手
- 前主密钥(Pre Master Secret):客户端产生的随机数C,用服务器的公钥(证书中)进行加密得到
- 客户端根据随机数A、随机数B以及随机数C计算出主密钥(Master Secret),然后对主密钥进行切片得到两个会话密钥A、B和两个鉴别密钥a、b(不会发送给服务端)
- ⚠️如果使用DH算法,就不需要传递前主密钥,双方可以根据交换各自的参数来算出这个随机数C,整个通话的安全决定随机数C是否被破解
- 加密通信算法改变通知Change Cipher Spec
- 客户端握手结束通知,生成所有握手报文数据的摘要,通过会话密钥A加密后发送给服务器,给服务器校验
传递前主密钥
具体抓包如下
使用DH算法传递参数
第四次握手
服务器收到客户端的消息后,利用自己的私钥解密出前主密钥C,根据随机数A、随机数B以及前主密钥C计算出主密钥,切片得到两个会话密钥A、B和两个鉴别密钥a、b
然后进行第四次握手,内容包括
- Session Ticket:下一次请求https的时候,可以使用这个session ticket,后续的https请求可以节省很多资源,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法
- 加密通信算法改变通知Change Cipher Spec
- 服务器握手结束通知,生成所有握手报文数据的摘要,使用会话密钥B加密后发送给客户端,给客户端校验
具体抓包如下
问题
- 为什么第三、四次握手需要发送所有握手报文的摘要
防止握手信息被篡改。
客户端支持的密码套件列表中,有些加密算法较弱,有些加密算法较强,而此密码套件是明文传输的,万一黑客将此密码套件列表进行了修改,只保留一些安全性较低的加密算法,那么服务器就只能从这些安全性较低的加密算法中选择,安全性大大降低。因此需要通过发送摘要的形式防止握手信息被篡改。
- 为什么不直接发送一个主密钥,而是用两个随机数加一个前主密钥重新生成一个主密钥呢?
防止连接重放
如果没有前面两个随机数,客户端生成一个主密钥并且通过公钥加密给服务器,黑客就可以冒充客户端给服务器发送相同的报文(即再次建立握手过程,即使不知道内容是啥),然后服务器会认为客户端再次https连接,然后黑客也可以发送相同的请求
有了前两个随机数,即使黑客想要连接重放,由于随机数不同生成的密钥也不同,黑客重新发送的内容将会失效
- Http一定比Https快吗
使用HTTPS并不一定比HTTP慢,只是在前期握手阶段会有时间损耗,但是包括后续在网络中传输的时候时候,一些路由器,网关又会对http请求限制,加密这样
References
https://mp.weixin.qq.com/s/4qSc0emO-CeNDaJlgSjbRA
https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html