# HTTPS

HTTP 为什么不安全?由于是明文传输,可能被窃听,可能被篡改,无法认证确认对方身份。

攻击手段:

  • XSS,即为(Cross Site Scripting),中文名为跨站脚本,主要方式是嵌入一段远程或者第三方域上的 JS 代码
  • CSRF(Cross-site request forgery),中文名为跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求。

# TLS/SSL

TLS/SSL 的功能实现主要依赖于三类基本算法:

  • 非对称加密实现身份认证和密钥协商
  • 对称加密算法采用协商的密钥对数据加密
  • 散列函数验证信息的完整性,针对于密钥泄露的不安全性

结合三类算法的特点,TLS 的基本工作方式:

  • 客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥
  • 然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取

# 对称加密

  • 相同的密钥可以用于信息的加密和解密,掌握密钥才能获取信息,能够防止信息窃听,通信方式是 1 对 1(前提示密钥不泄露)
  • 算法公开、计算量小、加密速度快、加密效率高
  • 客户端、服务器双方都需要维护大量的密钥,维护成本很高
  • 因每个客户端、服务器的安全级别不同,密钥容易泄露,交易双方都使用同样钥匙,安全性得不到保证

# 非对称加密

  • 非对称加密算法的特点加密和解密分别使用不同的密钥,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然。
  • 相对来说加解密速度较慢,使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率
  • 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容
  • 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改

# 完整性验证算法

  • 常见的有 MD5、SHA1、SHA256,该类函数特点是函数单向不可逆、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性
  • 在信息传输过程中,散列函数不能单独实现信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密

# 密钥协商

# 身份验证

服务方 Server 向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证。

# 为什么需要 HTTPS

HTTPS 是一种计算机网络进行安全通信的传输协议,实际利用 HTTP 进行通信,但是用 SSL/TLS 来加密数据包。它的出现主要是为了保护交互数据的隐私与完整性。

对于客户端和服务端通信数据的非对称加密,最大的风险是:MITM: Man-in-the-MiddleAttack

即公钥被中间人拿走后并进行篡改,这样接受者就会接收到假信息。

所以,核心的问题是:防止公钥被掉包,收到公钥的时候要确认这个公钥确实是指定的发送者发送的,而不是别人的。

HTTPS 使用 证书+数字签名 的方法来解决这个问题。步骤如下:

  • 服务端申请 SSL 证书
  • 客户端与服务端建立连接时,服务端会向客户端发送 SSL 证书
  • 浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发
  • 如果找到,那么浏览器就会从操作系统中取出 颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密
  • 浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,将这个计算的 hash 值与证书中签名做对比
  • 对比结果一致,则证明服务器发来的证书合法,没有被冒充
  • 此时浏览器就可以读取证书中的公钥,用于后续加密了

# 总结

HTTPS 就是使用 SSL/TLS 协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,完成整个 HTTPS 的流程。

# 学习资料

Last Updated: 5/22/2020, 5:01:49 PM