状态码

在服务器报头的位置,有一个数字表示这次客户端的请求结果是如何,这样有错误也能表现出来,可以精确的找到和去解决。现在我们就深度的了解这些比较常见的数字背后表达的含义。

  1. 状态码:200,表示OK
    这个状态码最为常见,也是表示客户端的请求成功。
  2. 状态码:404,表示Not Found
    这个状态码表示客户端尝试访问的资源不存在,也是非常常见,如果查询网址输入有误,大概率会弹出这个404 Not Found。
  3. 状态码:403,表示Fobidden
    这个状态码表示客户端没有权限访问该资源,有些资源是设为私有化的,所以就会弹出这个数字。
  4. 状态码:500,表示Internal Server Error
    这个状态码在一个完整的服务器返回中很难见到,但是如果你自己搭建一个服务器,其中的异常没有catch,就会返回这个状态码
  5. 状态码:504,表示Gateway Timeout
    这个状态码是服务器响应超时,一般都是服务器中突然有大量用户使用时,就会崩溃,即返回这个状态码,比如学生选课的时候,学校的服务器可能会崩溃,就是出现了这个问题。
  6. 状态码:302,表示Found
    表示重定向,转移,当一个域名更新后(一个域名表示一个IP地址,不同的域名就是不同的IP地址,就是两个完全不相干的东西),客户端再去访问旧域名,就会返回一个302状态码,转换到新的域名去。
    还有登录页面,每次用户去输入登录信息后,都会直接跳转到主页面,这里登录页面就是在接收到用户的POST请求后返回302状态码。
  7. 状态码:301,表示Moved Permanently
    也是表示转移,但是相比于302的临时转移,这里是永久成效的,直接缓存旧域名和新域名的对应关系。
  8. 状态码:418,表示I’m a teapot (一个小彩蛋,没有任何意义)

https协议

https协议就是加密后的http协议。众所周知,加密是为了防止黑客或者运营商修改和偷窃数据。那么问题是如何加密呢?
这里引出密钥,即把数据加密和解密的“钥匙”,加密的过程是利用算法+密钥,通过加密算法和密钥,把可读的明文传输转换成无法直接破译的 密文传输。密钥有两种类型:

  • 对称密钥
    对http中的数据(header body,也就是除了首行都加密)进行加密,加密和解密的密钥相同。
    优点:传输效率快,计算量小,适合传输大量数据,https大部分传输依赖对称密钥传输。
    缺点:但是事实上这样的加密很难保证安全性,在客户端把加密后的数据和用于解密的密钥发送给服务器时,如果中间有黑客进行截胡,拿到密钥,那么就可以解密,即拿到原始的数据。如果加密密钥,加上密钥的密钥,依旧传输密钥,还是无济于事。

  • 非对称密钥
    对对称密钥进行加密,用于加密和解密的密钥不相同。一个是发送出去用于加密对称密钥的公钥,还有一个是自己保存好用于解密的私钥。
    优点:利用公钥加密,私钥解密,这是没有绝对的,两个密钥都能做公钥或私钥,而且都能一方加密后用一方解密。非对称密钥的好处就是传输过程中,黑客拿到的公钥只能用来加密,不能解密,无法拿到原始数据。
    缺点:传输效率低,计算量大,不适合传输大量数据。

  • 中间人攻击
    这是一种十分隐秘的攻击手段,黑客在传输中途的路由器中不断扮演客户端和服务器,让双方都不能发现有任何问题,然后正常开始传输数据,就会被黑客拿到。当客户端和服务器确认公钥时,中间的黑客扮演服务器给客户端发送自己的公钥,但是客户端不知道正误,按照这个公钥加密,发送到黑客的路由器,黑客用自己的私钥进行解密,拿到了对称密钥,扮演客户端,用正确的公钥加密再发送给服务器,服务器也无法察觉任何不对,用私钥解密,拿到对称密钥,返回OK报文,就开始传输数据,从而黑客就在没被察觉下拿到数据。

  • 实际https工作模式(混合加密和+数字证书)

  1. 握手阶段(非对称加密):客户端和服务器通过非对称加密,安全协商出一把临时的对称密钥(会话密钥)。
  2. 传输阶段(对称加密):后续所有的 HTTP 请求/响应数据,全部使用这把会话密钥进行对称加密传输。

公钥和密钥有两个方面的使用,一个是公钥加密,私钥解密,用于保证安全性,防止于基本的黑客攻击;还有一个是密钥签名,公钥验签,用于验证身份正确,用于防止黑客进行中间人攻击。

  • 引入“证书”机制
    为了防止中间人攻击,添加了身份验证,用私钥加密,公钥解密,确保用户可以甄别发来的公钥是服务器的。
    由第三方公正机构,足够权威,可以保证公钥的正确性。正规的服务器都需要向第三方机构申请证书,比如用公钥和服务器的域名(身份标识),就像是一个人的身份证需要户口本和出生证明去申请,出行可以证明你的身份。
    第三方机构也有一对密钥,就是一个公钥,一个私钥,私钥是只有内部保留,外部无法获取,所以使用私钥加密;但是用于解密的公钥已经在客户端存在了,当双方通信时,客户端就会使用该服务器的公钥去解密,无需额外传输公钥。
    证书结构
    证书结构
  1. 公证机构身份标识
    用来告诉客户端是哪个机构进行加密的,每一个机构都有不同的私钥进行加密。
  2. 有效期
    一个证书是有时间限制的,证书过期需要重新申请,过期的证书也无法正常使用。
  3. 公钥
    就是服务器的公钥
  4. 所有者
    就是服务器的主域名
  5. 数字签名
    证书最为重要的一个标识,本质上是加密过的校验和,校验和就是和网络中校验和一样的机制(除了这里的全部数据进行数学公式计算后的结果,再进行对比,相同输入会得到相同结果),再用私钥进行加密,前面说到的私钥加密,就是这一块在执行,所以这里是身份验证的核心。
  • 验证证书流程
    所以客户端的第一步操作不再是索要“公钥”,而是索要“证书”。
  1. 客户端索要“证书”,服务器发送证书
  2. 客户端拿到证书,进行验证:
    • 查看公证机构的身份标识,知道解密的公钥;
    • 查看有效期,证书是否过期;
    • 用公钥进行解密,再计算出校验和,与发送来的校验和进行对比。
      如果所有都没有问题,就用发送来的公钥进行加密,随后发送给服务器,服务器用私钥进行解密。
      (访问有些网站时,会报出风险警告,告诉你访问的网站有风险,这就是网站的证书验证有误,当然你可以选择无视风险继续访问)

那为什么引入证书后,中间人攻击就无效了呢?

  1. 黑客能否像之前一样修改证书中服务器的公钥,改成自己的公钥发送给客户端?
    不能,服务器的公钥已经用证书的机制发送出去,并且有校验和 提前进行了计算,就算黑客修改了公钥,那么客户端再进行计算得出的校验和一定和之前的不同,所以对比发现不一样,就提示风险了。
  2. 黑客能不能修改证书中的公钥,同时修改数字签名?(基于上个问题,再修改校验和)
    这里的问题是就算黑客用第三方机构的公钥把数字签名中的校验和拿到了,并且把它改成自己公钥计算后的校验和,但是,无法再次进行私钥的加密,私钥是第三方机构独有的,黑客无法进行加密,就无法进行数字签名,基本的结构都凑不出来。
  3. 黑客自己生成一个私钥,使用自己的私钥进行加密?(也是基于上个问题,继续把私钥问题解决)
    这里的问题是用自己的私钥进行加密,但是客户端解密时,认的是公证机构身份标识给定的公钥进行解密,结果发现根本无法解密成功,也会提示风险。(就算黑客像之前发送自己用于解密的公钥过去,也无济于事,这里的公钥不再是通过网络传输的,而是内置在操作系统中的)
  • 总结
    用对称密钥对业务数据进行加密;
    用非对称密钥对对称密钥进行加密;
    用证书机制对公钥进行身份验证防止中间人攻击。

  • figgler抓包工具的实现方式
    其实figgler就是利用证书机制进行抓包。
    当你下载了figgler之后,都需要下载一个根证书,这就是figgler的证书,下载了之后你的电脑内部就认识了figgler。
    figgler抓包流程
    其实figgler也是中间人攻击的机制,但是它是你认识的中间人,即有了fiddler的公钥,可以解密figgler替换掉的数字签名,并且替换掉公钥之后计算的校验和,再用自己的私钥进行加密,把公证机构换成figgler,就成了figgler的返回数据包,客户端发现公钥可以正常解密,校验和对比相同,就无法发现错误,可以把在传输数据时,抓到数据包,却不被发现。

那为什么黑客不搞一个证书进行入侵呢?
因为我们的电脑没有给黑客的根证书下载到电脑内部,就算有证书,我们的电脑也不认识。

提一嘴figgler中的代理模式(可以抓包其他设备的数据包,同时需要其他设备开启允许代理这个选项)
这样之后别人的设备传输数据时,数据会先到达你的电脑,再转发到别人的设备。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐