轻量级、简单的 HTTP MITM 保护?

轻量级、简单的 HTTP MITM 保护?

需要说明的是:我并不想编写自己的协议或自己的客户端实现。我正在寻找一种现有的协议,它是 HTTP 标准的一部分,并且通常已得到常见浏览器的支持。(这种东西可能不存在。)

我有一个 HTTP 应用程序,需要一些保护来抵御中间人威胁。(服务器需要能够向客户端证明其响应的真实性。)加密无关紧要且没有必要。此外,考虑到预期的命中率,硬件预算非常少。

通常情况下,我只需获取一个便宜的证书并在 Web 服务器上启用 SSL,但负载生成器会杀死 Apache 和 Nginx(我也不指望其他 Web 服务器能做得更好)。对于非 HTTP 服务,负载很好。我还尝试配置 HTTPS 服务器以协商空加密密码。这有点帮助,但 SSL 握手仍然太重。

响应文档上的简单 SHA-1 签名(由服务器生成)并由客户端验证,对我来说就足够了。我编写了一个简单的 Python FastCGI 脚本和 HTTP 客户端来测试简单的 SHA-1 操作——它增加了一些负载,但并不多,甚至与使用空加密的 SSL 所增加的负载相差甚远。但在实践中,我的客户端不是 Python 脚本,而是 Web 浏览器。

(再次说明:我并没有提出自己的加密协议,Python 脚本只是对 SHA-1 哈希本身与 SSL 协商的其余部分相比产生的负载进行了测试。我不能使用自定义客户端实现,因为我没有办法为所有客户端浏览器安装它。)

那么:是否存在任何现有的轻量级(与 SSL 相比) HTTP 服务器身份验证协议?

答案1

您正在寻找的东西实际上并不存在。内置于浏览器和服务器的轻量级机制是 SSL。

答案2

如果您在内容中注入了 SHA1,而我却对您进行了 MITM 攻击,那我为什么不能修复 SHA1 呢?

答案3

一些解决方法包括:

  • 用户名/密码的 HTTP 摘要
  • 用于服务器地址验证的 DNSSEC
  • 制作 ajax 握手机制和 HMAC 页面验证。如果你插入模仿公钥/私钥机制的页面 - 第三方可以轻松篡改数据,否则 MITM 也可以轻松修复数据哈希。请记住,加密很少能正确完成,因此要站在别人的肩膀上并使用经过验证的机制。

    我建议你使用 SSL,并调优 nginx(查看 SSL 会话和密码)。否则你的 MITM 只会是拙劣的模仿,浪费工作和 CPU 周期。

答案4

使用模糊或定制的协议进行签名的问题在于它尚未内置到浏览器中。这意味着您需要向远程浏览器提供验证逻辑。如果您在提供该代码/逻辑时没有针对 MITM 攻击的保护,那么什么可以阻止 MITM 用无论看到什么都会返回“VALID”的代码替换验证代码 - 以及/或者,什么可以阻止 MITM 从客户端验证代码中提取用于 HMAC 的共享密钥并将其用于 MITM 攻击?

如果您无法进行实时 SSL 加密,您能否重新组织您的流程,以便使用 HTTP 传递预先计算的响应,这些响应是经过 GPG 签名的,或者作为批处理的一部分以其他方式离线签名的?如果您需要在计算/确定响应时包含来自用户的数据,您是否可以将请求添加到批处理队列中,稍后通过用户轮询 HTML 响应页面和/或通过电子邮件传递经过 GPG 签名的结果?

您是否需要 24x7x365 全天候提供服务,还是偶尔使用?(例如,注册类型的活动,在某一天或一周内负载很大,然后几个月内没有任何负载)如果是后者,您是否可以使用只租用一天或一周的基于云的服务器,然后关闭使用直到再次需要它?

相关内容