前端中的 Web 安全(一):HTTPS

引入:HTTP 存在的问题

HTTP协议在诞生之初,设计时并没有考虑安全上的问题。但随着互联网的发展,逐渐出现了企图利用web安全中的漏洞牟利的人,这时候便暴露出了HTTP协议所存在的两个主要问题:

  1. HTTP的报文是以明文形式传输的。如果在我们向服务端发请求时,有人在进行网络嗅探与监听,便可以轻松地得知请求中的数据,从而带来数据泄漏的危险。
  2. HTTP身份认证缺乏校验 ,其中最典型的问题便是中间人攻击 。假设在客户端和服务端的沟通过程中存在攻击者,攻击者与通讯两端分别建立联系,并且可以篡改请求和响应的内容 。这种情况下,客户端和服务端都认为是在与对方进行直接的通信,但实际上通信过程却被攻击者完全控制了。之所以出现这种情况正是因为通信各端缺乏有效的认证

为了解决HTTP协议存在的这两个问题,Netscape公司于1994年创建了HTTPS。相比于HTTPHTTPS大大增强了请求-响应的安全性,它的主要工作流程如下:

  • 在正式传输数据之前,首先进行身份验证,这保证了不会出现中间人攻击。
  • 认证成功后,协商之后通信的加密密钥,从而可以对报文进行加密
  • 后续的传输数据使用秘钥进行加密

一、例子:访问淘宝

接下来,我们结合这张图,通过一个例子对HTTPS的工作流程进行更加具体的介绍:

  1. 假设我们现在正在访问淘宝,为了之后交易等过程的安全,我们会向客户端发起HTTPS请求。
  2. 现在淘宝收到了这个请求,为了确保在建立HTTPS请求的过程中,客户端收到的请求是来自自己而不是中间人,需要一个能够证明自己身份的唯一凭证,让客户端去验证,这个凭证也就是证书 。除此之外,淘宝还会有一对公钥和私钥,用来在协商密钥的过程中进行非对称加密。其中私钥只有自己知道,但是公钥可以让所有人知道。
  3. 接下来淘宝会把公钥放到证书中发给客户端。
  4. 客户端拿到了**(证书,公钥)**之后,首先会对证书进行验证,验证的过程我们会放在第二部分进行讲解。这里只需要知道,如果验证成功,则说明请求没有被中间人所篡改。
  5. 验证成功后,客户端会生成一个随机字符串s,作为之后对称加密 的密钥。客户端将s使用公钥加密后发给服务端,由于公钥加密的内容只有私钥能够解密,而私钥又只有淘宝有,因此只有淘宝能够解密从而得到s
  6. 至此,密钥s的内容只有客户端和淘宝知道,因此之后的通信过程中只需要使用s对明文内容进行对称加密,即可实现报文的加密。

如果是为了应付前端岗位的HTTPS内容面试,说到这里就已经算是回答个大概了,但是如果想要能够回答面试官的追问,就需要对其中的一些内容有更深入的了解。接下来,我们分别对HTTPS中的身份认证协商密钥做更加深入的介绍。

二、身份认证

我们刚才说到过,HTTPS的身份认证是通过证书实现的,服务端把证书和公钥发给客户端后,客户端会对证书进行验证。

那么,什么是证书?客户端又是如何对证书进行验证的呢?

所谓证书,就是由证书管理机构(CA)向颁发对象(例如淘宝网)颁发的身份凭证。通过将颁发对象的身份信息进行签名 后,和颁发对象的信息一起构成证书。

举个例子来说,假如淘宝网想要使用证书,就需要向CA购买证书。CA会根据以下表格中的数据,对数据进行签名(即对数据进行哈希运算后使用私钥加密),从而得到证书。

例如淘宝网的证书就是长这样的,我们可以看到证书是由GlobalSign颁发的:

GlobalSign根证书则是存储在系统中的,因此浏览器会信任该根证书以及该根证书所颁发的证书,从而信任淘宝网的证书。

现在我们已经知道了证书其实就是颁发对象的信息及其签名。那么,客户端是如何验证证书的呢?

前面说过,签名是哈希运算 + 私钥加密。那么如果证书没有被篡改,则先对签名使用公钥进行解密,再将颁发对象的信息进行哈希运算,两者的结果应该是相等的。如果两者不相等,则一定说明有中间人对证书中的内容进行了篡改。

三、协商密钥

说完了身份验证,我们再来看一下协商密钥的内容。总的来说,这部分可以分为两步:

  1. 使用非对称加密,确保客户端生成的用于通信的对称密钥,不被攻击者监听获取
  2. 使用对称密钥进行通信

其中1我们在淘宝的例子中已经进行了解释:客户端生成的对称密钥会使用公钥进行加密,而想要解密就只能使用私钥,而私钥只有服务端有,因此只有服务端可以获知对称密钥。因此之后使用对称密钥进行HTTPS通信可以保证加密的内容不会被监听者破解。

那么,为什么要使用非对称加密 + 对称加密的手段呢?我们不妨来看看其他手段存在哪些问题。

首先,只使用对称加密是肯定不可行的。因为服务端没有办法只让客户端知道对称密钥,而不会被监听者获知。

如果只使用非对称加密呢?这种方式是可以实现我们的目的的,只需要浏览器也生成一对公私钥,把公钥公布出去。这样服务端和客户端之间的通信都使用公钥加密,则解密只能使用私钥,而私钥分别掌握在服务端和客户端上,因此保证了通信的安全性。但是这样的问题在于,非对称加密的耗时较大 ,相比于对称加密会耗费更多的时间。为了性能考量,HTTPS选择了使用非对称加密+对称加密。

回到第2步,我们现在已经可以使用对称密钥进行通信了,那么HTTPS怎么确保密文没有被中间人篡改呢?这里同样用到了哈希函数(因为哈希函数有个很好的性质,只要输入改变了一点,输出相比原来就会大相径庭)。

我们举个例子,例如现在服务端要给客户端发送响应,服务端会对加密后的报文使用哈希函数进行处理(即生成报文的摘要),并把报文和摘要同时发给客户端。当客户端收到响应后,首先要生成报文的摘要,并和响应中的摘要进行对比。如果报文没有被篡改,则摘要应该是相同的;但是但凡报文被篡改了哪怕一个字符,生成的新的摘要相比原来都会完全不一样。因此我们可以通过这种方法来确保通信的内容不被篡改。

四、总结

  • HTTPS协议通过非对称加密传递对称密钥,通信过程使用对称加密,从而对明文内容进行加密,确保监听者无法获取报文内容
  • HTTPS通过证书来进行身份校验
  • HTTPS通过对报文内容生成摘要确保报文内容不被篡改,避免中间人攻击
相关推荐
掘金者阿豪25 分钟前
把业务数据变成共享仪表盘:Metabase可视化与远程访问实践
前端·后端
kyriewen1 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端1 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员2 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为2 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid2 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger3 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程
lichenyang4533 小时前
JSAPI、NAPI、Biz、Imp:ASCF Demo 如何真正调用系统能力和 C++ 能力
前端
lichenyang4533 小时前
IPC、JSVM、UIThread、libuv:ASCF 架构图里最容易混的几个词
前端
用户059540174463 小时前
Redis记忆存储故障恢复测试踩坑实录:手动测试让我漏掉了2个一致性Bug
前端·css