参考视频:https://www.bilibili.com/video/BV1w4411m7GL
HTTP请求过程中,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,所以很容易遭到黑客的攻击
TLS/SSL加密算法
HTTPS就是HTTP+TLS/SSL
TLS/SSL全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。
TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash、对称加密、非对称加密。
这三类算法的作用如下:
- 基于散列函数验证信息的完整性(数据有没有被篡改)
- 非对称加密实现身份认证(证明公钥不是伪造的)和秘钥协商(获取对称加密的密钥)
- 对称加密算法采用协商的秘钥对数据加密
散列函数hash
常见的散列函数有MD5、SHA1、SHA256。该函数的特点:
- 单向不可逆,对输入数据非常敏感,输出的长度固定
- 任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性。
- 由于传输是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。
对称加密
对称加密的方法是,双方使用同一个秘钥对数据进行加密和解密。
常见的对称加密算法有AES-CBC、DES、3DES、AES-GCM等。相同的秘钥可以用于信息的加密和解密。掌握秘钥才能获取信息,防止信息窃听,其通讯方式是一对一。
问题:
- 就是如何保证秘钥传输的安全性
- 因为秘钥还是会通过网络传输的,一旦秘钥被其他人获取到,那么整个加密过程就毫无作用了
- 服务器和N个客户端通信,需要维持N个密钥
- 如果所有客户端公用一个密钥,黑客就可以伪造成客户端获取密钥来解密其他客户端获得的信息
- 不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高
- 因每个客户端、服务器的安全级别不同,密钥极易泄露
非对称加密
常见的非对称加密算法有RSA、ECC、DH等。
秘钥成对出现,一般称为公钥(公开)和私钥(保密)。
- 公钥加密的信息只有私钥可以解开
- 私钥加密的信息只能公钥解开
- 服务器持有公钥和私钥
- 客户端持有公钥
特点:
- 非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信
- 计算复杂,加密的速度慢
问题:
- 客户端发到服务器的信息,公钥加密,私钥解密,私钥只有服务器有,所以绝对安全
- 服务器发到客户端的信息,私钥加密,公钥解密,黑客能拿到公钥!危险!
对称+非对称加密
结合对称加密和非对称加密的优点提出的方式:
- 非对称加密:保证客户端向服务器发送的信息(公钥加密,私钥解密),绝对安全
- 对称加密:只有客户端和服务器拥有密钥时,绝对安全
如图:
- 客户端向服务器索要公钥,服务器发送公钥
- 客户端生成随机数1,用公钥加密,发给服务器,安全,因为只能用私钥解密
- 服务器用私钥解密,获取随机数1
- 客户端和服务器都有随机数1了,之后的通信都使用这个数进行对称加密
中间人攻击
以上方法看似很安全,但是无法防范中间人攻击
黑客组装一个伪装的服务器,也存储了一组私钥和公钥
- 黑客拦截服务器发给客户端的公钥,把假公钥发给客户端
- 客户端用假公钥加密随机数发给黑客,黑客就能用假私钥解密
- 这样黑客可以获取所有与用户的通信
- 同时黑客再伪装成客户端去跟服务器通信
数字证书
中间人攻击的根本原因是用户使用了黑客提供的假公钥,所以验证公钥是真实可信的才进行通信就行了
- 首先使用一种 Hash 算法来对公钥和其他信息进行加密,生成一个信息摘要
- 然后让有公信力的认证中心(简称 CA )用它的私钥对消息摘要加密,形成签名。
- 最后将原始信息和签名合在一起,称为数字证书。
- 当接收方收到数字证书的时候,
- 先根据原始信息使用同样的 Hash 算法生成一个摘要
- 然后使用CA的公钥来对数字证书中的摘要进行解密
- 最后将解密的摘要和生成的摘要进行对比,就能发现得到的信息是否被更改了。
这个方法最要的是认证中心的可靠性,一般浏览器里会内置一些顶层的认证中心的证书,相当于我们自动信任了他们,只有这样才能保证数据的安全。
HTTPS握手过程
HTTPS的通信过程如下:
- 客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数1、以及客户端支持的加密方法。
- 服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数2。
- 客户端确认服务器证书有效
- 客户端生成一个新的随机数3,并使用数字证书中的公钥,加密这个随机数3,然后发给服务器。并且还会提供一个前面所有内容的 hash 的值,用来供服务器检验。
- 发送公钥加密的随机数3+前面所有内容的 hash 的值
- 随机数1、2可能被截获,但随机数3绝对安全
- hash是让服务器验证随机数1、2有没有被篡改
- 发送公钥加密的随机数3+前面所有内容的 hash 的值
- 服务器使用自己的私钥,来解密客户端发送过来的随机数3。并提供前面所有内容的 hash 值来供客户端检验。
- 发送前面所有内容的 hash 值来供客户端检验
- hash是让客户端验证随机数1、2、3没有被篡改
- 发送前面所有内容的 hash 值来供客户端检验
- 客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息。
HTTPS优缺点
HTTPS的优点如下:
- 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;
- 使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据安全性;
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对的安全,但是大幅增加了中间人攻击的成本;
HTTPS的缺点如下:
- HTTPS需要做服务器和客户端双方的加密解密处理,耗费更多服务器资源,过程复杂;
- HTTPS协议握手阶段比较费时,增加页面的加载时间;
- SSL证书是收费的,功能越强大的证书费用越高;
- HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本;
- SSL证书需要绑定IP,不能再同一个IP上绑定多个域名。