HTTP的缺点:
- 通信使用明文(不加密),内容可能会被窃听;
- 通信内容在所有的通信线路上都有可能遭到窥视,因为窃听相同段上的通信不是难事,只需要手机在互联网上流动的数据包(帧)就可以,再利用抓包工具(Wireshark)或嗅探工具解析数据就可以了。
- 避免方法
- 通信的加密:使用SSL(Secure Socket Layer,安全套接层)或 TSL(TRansport Layer Security,安全传输协议)
- 内容的加密:客户端对请求报文主体内容进行加密,报文本身还是不加密的。
- 不验证通信方的身份,因此有可能遭遇伪装;
- 原因:HTTP协议中的请求和响应不会对通信方进行确认。
- 缺点:
- 无法确定返回响应的服务器是否是真实的;
- 无法确定接受响应的客户端是否是真实的;
- 无法确定正在通信的对方是否具备访问权限;
- 无法判断请求来自何方,出自谁手;
- 即使是无意义的请求也会照单全收。
- 解决办法:
利用SSL的证书手段,在通信之前进行证书查找。
- 无法证明报文的完整性,所以报文有可能已遭篡改。
- 所谓完整性是指信息的准确度。
- 请求或响应在传输中遭到攻击者拦截并篡改内容的攻击称为中间人攻击,攻击人可以随意篡改请求和响应,而让客户端与服务器之间的通信看上去仍然正常。
- 解决办法:看下文
密码学工具箱
密码学工具箱.png用来对应密码的技术
对称加密(私有密钥加密)
有且仅有一个密钥加密解密。
- 优点:速度快
- 分类:
- DES
- AES
- 存在问题:
以共享密钥方式加密时必须将密钥也发送给对方。发送密钥就有被窃听的风险,但不发送,对方就不能解密。再者,密钥若能够安全发送,那么数据也应该能够安全发送。
非对称加密(公开密钥加密)
两个密钥。包括公钥和私钥,都可以进行加密和解密,但是公钥加密,私钥可解密;私钥加密,公钥可解密。
- 缺点:速度慢。
- 优点:安全性高。
- 原理:
发送方利用对方的公开密钥进行加密处理后发送数据,接收方利用自己的私有秘钥进行解密处理。 - 分类:
-
RSA
加密解密过程.png
非对称加密速度很慢,当加密大量数据时,表现比较明显,所以解决办法是:不对数据进行加密,而是对随机数进行加密,而这个随机数就是对称加密的秘钥。也就是说先用对称加密对数据进行加密,生成随机数,之后再用非对称加密对随机数进行加密,解密的时候是先用非对称解密,之后再用对称解密。
-
- 使用公开密钥方式安全地交换在稍后的共享密钥加密中要使用的密钥;
-
确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信。
混合加密.png
单向散列(hash)
通过固定算法把数据生成固定长度的随机数。把一堆数据压缩成固定长度,不能恢复。
- 作用:用于检测完整性。
- 加密算法:
- MD5(安全性低)
- SHA1,SHA256
-
优点:任意长度的原始数据都可以变成固定长度,而且只要输入不一样,输出一定不一样。
单向散列原理图.png
消息认证码
散列+共享密钥
-
解决伪造问题。(不能保证数据是真实的,但能保证数据是谁发的。)
消息认证.png
(需要手动添加一个密钥,密钥值不一样,生成的MAC值就不一样,MAC能够查知报文是否遭到篡改,从而保护报文的完整性。)
消息认证实例.png
数字签名
- 解决否认问题(因为是用自己的私钥加密的,别人没有你的私钥,而且是用你自己私钥对应的公钥解密的,所以不能否认。)
数字签名原理.png
用私钥进行加密,用公钥解密。
数字签名实例.png - 缺点:私钥对大量数据加密,速度慢。
速度更快的签名:利用单向散列函数
速度更快的签名.png
签名:就是先利用单向散列函数对数据进行处理,之后把处理后的数据用私钥进行加密。
证书
公钥证书也叫数字证书或证书。数字证书认证机构处于客户端和服务器双方都可信赖的第三方机构的立场。(威瑞信)
- 解决了公钥的传递的安全性问题。
-
业务流程:
首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,已进行公开密钥机密方式通信。接到证书的客户端可使用数字认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务的公开密钥是真实有效的数字证书认证机构;二,服务器的公开密钥是值得信赖的。
证书实例.png
PKI体系
PKI体系图.pngHTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS原理概述
一个故事让你彻底理解HTTPS
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TSL协议替代而已。通常,HTTP直接和TCP通信,当使用SSL时,则HTTP先和SSL通信,再由SSL和TCP通信。
HTTPS的通信步骤
- 客户端通过发送Client Hello 报文开始SSL通信。
- 服务器可进行SSL通信时,会以Server Hello报文作为应答。
- 之后服务器发送Certificate报文,报文中包含公开密钥证书。
- 最后服务器发送Server Hello Done 报文通知客户端,最初阶段的SSL握手协商部分结束。
- SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。
- 接着客户端继续发送Change Cipher Spec报文。
- 客户端发送Finshed报文。
- 服务器同样发宋体Change Cipher Spec报文。
- 服务器同样发送Finshed报文。
- 服务器和客户端的Finshed报文交换完毕之后,SSL连接就算建立完成。
- 应用层协议通信,及发送HTTP协议。发送数据时会附加一种叫做MAC的报文摘要,MAC能够查知报文是否遭到篡改,从而保护报文的完整性。
- 最后由客户端断开连接,断开连接时,发送close_notify报文。
为什么不一直使用HTTPS协议进行通信呢?
- 与HTTP相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定会随之减少。
- 开销大,使用HTTPS协议,必须向认证机构(CA)购买证书。
SSL/TLS协议
SSL是独立于HTTP的协议,不仅仅是HTTP协议,其他运行在应用层的协议(SMIP和Telnet)均可配合SSL协议使用。SSL是当今世界上应用最为广泛的网络安全技术。
- 缺点: 速度慢:
- 通信慢
- 由于大量消耗CPU及内存等资源,导致处理速度变慢。
SSL/TLS协议流程
- 浏览器将自己支持的一套加密算法发给服务器,同时发一个浏览器随机数。
- 服务器向浏览器发送选择的加密算法、服务器生成的随机数、服务器数字证书。
- 浏览器收到证书后对证书的CA签名进行验证,如果验证通过,会从证书中拿到服务器的公钥。
- 浏览器对浏览器随机数+服务器随机数进行处理,生成预备主密码。
- 浏览器用服务器的公钥对预备主密码进行加密,发给服务器。
- 服务器收到后使用自己的私钥解密出预备主密钥。
(主密码用来生成真正的共享密钥的) - 浏览器和服务器分别使用预备主密钥和两个随机数,生成共享主密钥
- 二者使用共享主密钥,使用对称加密算法加密数据。
-
主密钥的生成过程:
主密钥的生成过程.jpg
主密码服务器和客户端根据下列信息计算出来的:
- 预备主密码
- 客户端随机数
- 服务器随机数
每次https请求,都需要使用上面的流程握手协商吗?
答:第一次协商主密钥后,后面的请求就使用主密钥进行对称加密通信,不需要再协商。通过会话id来识别。
网友评论