要清楚:我不想写我自己的协议,或我自己的客户端实现。 我正在寻找一个现有的协议,HTTP标准的一部分,通常已被普通浏览器支持。 (这样的事情可能不存在。)
我有一个HTTP应用程序需要一些保护从中间人的威胁。 (服务器需要能够certificate其对客户端的响应的真实性。)encryption是不相关的,也是不必要的。 另外,考虑到预期的命中率,硬件预算相当小。
通常情况下,我只是得到一个便宜的证书,并启用Web服务器上的SSL,但负载生成器杀死Apache和Nginx(我不希望任何其他Web服务器做得更好)。 对于非HTTP服务,加载是好的。 我也尝试configurationHTTPS服务器来协商一个空encryption密码。 这有一点帮助,但是SSL握手仍然太重了。
响应文档上的一个简单的SHA-1签名(由服务器生成)由客户端validation,对我来说很合适。 我写了一个简单的Python FastCGI脚本和HTTP客户端来testing裸SHA-1操作 – 它增加了一些负载,但不是太多,甚至不接近具有空encryption的SSL添加。 但实际上,我的客户不会是Python脚本,它们将成为Web浏览器。
(再次澄清:我不是在提议自己的encryption协议,Python脚本只是testingSHA-1哈希产生的负载本身,而不是SSL协议的其余部分。我不能使用自定义的客户端实现,因为我没有办法为所有的客户端浏览器安装它。)
那么:HTTP是否有任何EXISTING轻量(与SSL相比)服务器authentication协议?
你正在寻找的东西并不存在。 内置于浏览器和服务器的轻量级机制是SSL。
如果您在内容中注入了SHA1,而我正在对您进行操作,那么是否让我只修复SHA1呢?
一些解决方法包括:
使ajax握手机制和HMAC页面validation。 如果插入页面模仿公钥/私钥机制 – 第三方可以很容易地篡改数据,否则MITM也可以轻松修复数据散列。 请记住,密码学很less做对,所以站在别人的肩膀上,并使用成熟的机制。
我build议你使用ssl,调整nginx(看看ssl会话和密码)。 否则你的MITM将只是模仿和浪费的工作和CPU周期。
根据您对客户端有多less控制权,您可以用HMACSHA1replace易碎的SHA1。 HMAC的问题在于,他们需要事先在传输的两端都知道秘密密钥。 任何有权访问您的客户端的人都可能通过反汇编来提取密钥。
我们之前使用过这种情况,我们有两个独立的Web服务器,一个提供网站,一个处理订单,位于地理上不同的数据中心。 这确保了没有人能够将请求直接发送到履行服务器并向人们开账单。
使用模糊或定制协议进行签名的问题在于,它尚未embedded到浏览器中。 这意味着您需要将validation逻辑提供给远程浏览器。 如果您在交付代码/逻辑时无法防止MITM攻击,那么阻止MITM将validation代码replace为返回“有效”(无论它看到什么内容)和/或停止MITM从客户端validation代码中提取用于HMAC的共享密钥,并将其用于MITM攻击?
如果你只是不能做实时的SSLencryption,你能重新组织你的过程,以便你使用HTTP来提供预先计算的GPG签名的响应,或作为批处理的一部分离线签名? 如果您需要在计算/确定响应时包含来自用户的数据,是否可以将请求添加到批处理队列中,以后通过用户轮询HTML响应页面和/或通过电子邮件发送GPG签名的结果?
你需要这个24x7x365,或者这是零星使用吗? (例如,注册types的事件,你在一天或一周有很多的负载,然后几个月没有)如果是后者,你可以使用基于云的服务器,你只需租一天或一周,然后减速直到你再次需要它?
不要试图解决错误的问题,抓住一个encryption加速卡,或把Nginx放在你的Web服务器之前的一个SSL加速器/反向代理configuration,并完成它。