图解中间人攻击

图解中间人攻击何为 HTTP 中间人攻击 HTTP 协议使用起来确实非常的方便 但是它存在一个致命的缺点 不安全 我们知道 HTTP 协议中的报文都是以明文的方式进行传输 不做任何加密 这样会导致什么问题呢 下面来举个例子 小明在 JAVA 贴吧发帖 内容为我爱 JAVA 被中间人进行攻击 内容修改为我爱 PHP 可以看到在 HTTP 传输过程中 中间人能看到并且修改 HTTP 通讯中所有的请求和响应内容 所以使用 HTTP 是非常的不安全的 如何防止中间人攻击这个时候可能就有人想到了 既然内容是明

何为HTTP 中间人攻击

HTTP 协议使用起来确实非常的方便,但是它存在一个致命的缺点:不安全。我们知道 HTTP 协议中的报文都是以明文的方式进行传输,不做任何加密,这样会导致什么问题呢?下面来举个例子:

小明在 JAVA 贴吧发帖,内容为我爱JAVA:

图解中间人攻击

被中间人进行攻击,内容修改为我爱PHP

图解中间人攻击

可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请求和响应内容,所以使用 HTTP 是非常的不安全的。

如何防止中间人攻击

这个时候可能就有人想到了,既然内容是明文那我使用对称加密的方式将报文加密这样中间人不就看不到明文了吗,于是如下改造:

双方约定加密方式

图解中间人攻击

使用 AES 加密报文 

图解中间人攻击

 这样看似中间人获取不到明文信息了,但其实在通讯过程中还是会以明文的方式暴露加密方式和秘钥,如果第一次通信被拦截到了,那么秘钥就会泄露给中间人,中间人仍然可以解密后续的通信:

图解中间人攻击

那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用非对称加密,我们可以通过 RSA 算法来实现。这个步骤实际操作也是比较简单的。在约定加密方式的时候由服务器生成一对公私钥,服务器将公钥返回给客户端,客户端本地生成一串秘钥(AES_KEY)用于对称加密,并通过服务器发送的公钥进行加密得到(AES_KEY_SECRET),之后返回给服务端,服务端通过私钥将客户端发送的AES_KEY_SECRET进行解密得到AEK_KEY,最后客户端和服务器通过AEK_KEY进行报文的加密通讯,改造如下:

图解中间人攻击

可以看到这种情况下中间人是窃取不到用于AES加密的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?所谓道高一尺魔高一丈,中间人为了对应这种加密方法又想出了一个新的激活成功教程方案,既然拿不到AES_KEY,那我就把自己模拟成一个客户端和服务器端的结合体,在用户->中间人的过程中中间人模拟服务器的行为,这样可以拿到用户请求的明文,在中间人->服务器的过程中中间人模拟客户端行为,这样可以拿到服务器响应的明文,以此来进行中间人攻击:

图解中间人攻击

 这一次通信再次被中间人截获,中间人自己也伪造了一对公私钥,并将公钥发送给用户以此来窃取客户端生成的AES_KEY,在拿到AES_KEY之后就能轻松的进行解密了。中间人这样为所欲为,就没有办法制裁下吗,当然有啊,接下来我们看看 HTTPS 是怎么解决通讯安全问题的。

HTTPS 如何避免中间人攻击

HTTPS 其实是SSL+HTTP的简称,当然现在SSL基本已经被TLS取代了,不过接下来我们还是统一以SSL作为简称,SSL协议其实不止是应用在HTTP协议上,还在应用在各种应用层协议上,例如:FTP、WebSocket。其实SSL协议大致就和上一节非对称加密的性质一样,握手的过程中主要也是为了交换秘钥,然后再通讯过程中使用对称加密进行通讯,大概流程如下:

图解中间人攻击

这里我只是画了个示意图,其实真正的 SSL 握手会比这个复杂的多,但是性质还是差不多,而且我们这里需要关注的重点在于 HTTPS 是如何防止中间人攻击的。通过上图可以观察到,服务器是通过 SSL 证书来传递公钥,客户端会对 SSL 证书进行验证,其中证书认证体系就是确保SSL安全的关键。

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205110.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:47
下一篇 2026年3月19日 下午6:47


相关推荐

  • Databus for Oracle

    Databus for OracleDatabus组成Relay:数据抓取端读取数据源变更行(ROW),并将变更行数据序列化到内存缓冲区。监听客户端请求并传输缓冲区的数据。Client:数据客户端检查Relay端的数据变更,并同步数据。如果与Relay之间数据变更相差太大、会执行追溯功能。注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。bootstrap-pr…

    2022年10月16日
    5
  • redis过期时间实现原理_redis过期时间实现原理

    redis过期时间实现原理_redis过期时间实现原理一、有效时间设置:redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间,Expires也被称为过期字段。 四种处理策略EXPIRE将key的生存时间设置为ttl秒PEXPIRE将key的生成时间设置为ttl毫秒EXPIREAT将key的过期时间设置为timestamp所代表的的秒数的时间戳PEXPIR…

    2026年4月13日
    2
  • 关于 strlen 与 sizeof 的区别

    关于 strlen 与 sizeof 的区别关于 strlen 与 sizeof 的区别 我相信很多人都有所了解 以下我总结了几点关于 strlen 与 sizeof 的区别和注意事项 1 strlen 是函数 sizeof 是运算符 2 strlen 测量的是字符的实际长度 以 0 结束 而 sizeof 测量的是字符的分配大小 比如 charstr 20 hello printf strlen

    2026年3月17日
    2
  • python进阶(23)用Python实现AES_ECB_PKCS5加密

    python进阶(23)用Python实现AES_ECB_PKCS5加密前言AES加密的模式有很多种,下面来介绍ECB模式的加密解密importbase64fromCrypto.CipherimportAESclassAESECB:def__init

    2022年8月7日
    4
  • 最简单的slob实现

    最简单的slob实现为什么需要 slob 在内核空间 每次分配页面 伙伴系统 只能分配 4K 的倍数的大小 如果需要分配字节为单位的内存 则需要 slob 机制 在 slob 机制中 是在伙伴系统的基础上分配内存 然后对内存块进行细分 slob 机制设计思路 1 并没有按照对象的大小来分配一个特定的 slabcache 任何 size 的 slab 对象都可以拥挤到一个 page 里 即一个 page 里可以同时存在不同大小的对象 2 没有 pre cpu 的缓存和多核 share 缓存的思想 3 需要分配对象时 就从一个有空闲空间的

    2026年3月18日
    2
  • NOIP2011 观光公交

    NOIP2011 观光公交话说 我终于 AC 了这个题这是一个贪心 说实话开始做的时候 完全没看出来 QAQ 可能有人说这是个 dp 但这真不是 dalao 请无视 这真的只是个贪心 首先对于每个点当然是能走就走 不能走就等待 这是无法控制的 所以只考虑氮气加速器加在哪里可以使时间总和尽量少 所以如果选择加速 可能会使后面等待的时间更长 或者更短 对后面都会有影响 但是沿着一条边加速会影响后面的所

    2026年3月17日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号