当前位置: 首页 > article >正文

【HTTPS】中间人攻击和证书的验证

中间人攻击

服务器可以创建出一堆公钥和私钥,黑客也可以按照同样的方式,创建一对公钥和私钥,冒充自己是服务器(搅屎棍

image.png|640image.png|514

  • 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的,服务器能生产,黑客也能生成
  • 客户端拿到 pub2 之后,无法区分 pub2 是否是服务器的,于是就拿着 pub2 就对 key 进行加密了
  • 随后信息到达黑客之后,就使用 pri2 对上述数据进行解密,然后黑客就拿到了 key
  • 黑客继续使用从服务器拿到的 pub1key 进行加密,传给服务器·
  • 服务器拿到数据之后,使用 pri1 来解密,于是知道了对称密钥是 key。后续的通信,服务器和客户端之间,仍会继续使用 key 作为加密的密钥。此时后续传输的各种数据就可以被黑客解密了

引入证书

针对中间人攻击,怎么解决?


最关键的一点,客户端在拿到公钥的时候,要能有办法验证,这个公钥是否是真的,而不是黑客伪造的。这就要求服务器这边,要可以提供一个“证书”

  • 证书是一个结构化的数据(里面包含很多属性,最终以字符串的形式提供)
  • 证书中会包含一系列的信息(服务器的主域名、公钥、证书有效期…)

证书是搭建服务器的人,要从第三方的共振机构进行申请的
image.png

证书的验证

证书里面包含:

  • 服务器的域名:…
  • 证书的有效时间:…
  • 服务器的公钥:…
  • 公正机构信息:…
  • 证书的签名:…(验证过程中最重要的

证书签名

此处的签名本质上是一个经过加密的校验和

  • 把证书中其他的字段通过一系列的算法(CRC、MD5 等),得到一个较短的字符串,就是校验和
  • 如果两份数据内容一样,此时校验和就一定是相同的;如果校验和不同,则两份数据一定不同

颁布证书的公证机构,会在颁布证书的时候,给这个证书计算出校验和。然后公正机构会使用自己的私钥(和服务器的私钥无关),针对校验和进行加密,此时就得到了证书的签名

验证过程

客户端拿到证书之后,主要做两件事:

  1. 按照同样的校验和算法,把证书的其他字段都重新算一遍,得到 校验和1
  2. 使用系统中内置的公正机构的公钥,对证书中的签名进行解密,得到 校验和2

此时,就可以对比,这两个校验和是否一致。若一致,就说明证书是没有被修改过的,就是原版证书;若不一致,就说明证书被人篡改过了(比如黑客如果替换了自己的公钥,此时出来的校验和一定发生变化),此时客户端就能识别出来了

  • 此时浏览器这边就会弹出一个告警页面,告诉用户,你访问的网站有风险,请谨慎访问!!!(可能是黑客进行了中间人攻击,也可能是证书过期了)

市面上的公正机构一共也没多少,这些公正机构都有自己的私钥,对应的公钥都包含在常见的系统中。Windows 里面就内置了大量的公钥(如果没有,也可以额外安装)

  • 前面安装 fiddler 的时候,有一步操作就是在安装证书(主要就是在安装 fiddler 这边提供的公钥)

证书是为了防止黑客篡改,而不是为了避免黑客知道。黑客的系统也内置了公正机构的公钥,黑客也能进行解密

  1. 如果黑客直接修改公钥,不修改签名。此时,客户端验证的校验和是一定不一样的,直接就识别出来了

  2. 如果黑客修改公钥,也尝试重新生成签名,由于黑客不知道公正机构的密钥,所以黑客无法重新生成加密的签名。
    如果黑客拿自己的私钥加密呢?客户端这边拿着公证机构的公钥也会解密失败

  3. 黑客能不能自己也去公证机构申请个证书?然后把自己的整数替换掉服务器的证书呢?
    证书中还需要包含服务器的域名,域名是唯一的,黑客申请的证书的域名,和原服务器的域名肯定是不同的。
    客户端拿到证书之后,一看域名都不一样,直接就知道证书是假的了,都不用进行校验和验证了


当然,上述的过程,所谓的安全,也不是绝对的安全。上述的安全本质上都是基于非对称加密体系。非对称加密体系也不是无懈可击的,只不过破解这样的加密体系,需要的计算量非常大,超出了现有计算机的算力上限。

随着算力的提升,尤其是量子计算机崛起,我们的算力又会大幅度提升,对现有的密码学体系就会造成重大冲击


http://www.kler.cn/a/325333.html

相关文章:

  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
  • STL序列式容器之list
  • Python Excel XLS或XLSX转PDF详解:七大实用转换设置
  • SpringBoot实现WebSocket
  • C++ 编程基础(5)类与对象 | 5.8、面向对象五大原则
  • 【MySQL】InnoDB内存结构
  • 手写SpringMVC
  • Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具
  • Rustrover2024.2 正式发布:个人非商用免费,泰裤辣
  • 更新日志-Python OS
  • 动态规划(3)——dp多状态问题Ⅰ
  • 云舟观测:集成开源Grafana Faro构建前端页面性能监控平台
  • Linux开机logo设置
  • Spring MVC 拦截器总结
  • 数据结构:树、森林
  • 峟思助力堤防工程安全:构建多功能防洪屏障
  • Qt+toml文件读写
  • 【Linux】环境变量(初步认识环境变量)
  • C++不同的头文件中各种函数的操作使用(长期更新,找到新的就补充进来)
  • Jenkins提示Host key verification failed的解决办法
  • Linux Reverse(1)-LD_PRELOAD
  • workerman 接入文心一言的流式输出
  • 解决错误Cloning failed using an ssh key for authentication
  • android system_server进程
  • 【QT 开发日志】QT 基础控件详解:按钮、文本框与标签的使用
  • AlmaLinux 安裝JDK8