C++轻量级linux web直通服务器

C++ Light-weight linux web pass through server

本文关键字:直通 服务器 web linux 轻量级 C++      更新时间:2023-10-16

我遇到了一个奇怪的情况,我需要一个移动应用程序以安全的方式与我的web服务器通信,但由于成本和不支持自签名证书的事实,使用普通SSL不是一种选择。我已经尝试使用RSA实现php隧道来加密我的数据,如图所示。php加密隧道可能吗?,不幸的是,与普通SSL相比,这种设置的性能非常荒谬。

我的另一个选择是为PHP创建一个C++扩展,以尝试加速加密过程,但我仍然不确定它的性能,为PHP创建C++扩展的整个过程似乎令人难以置信地望而生畏。

我能看到的最后一个选择是将我的web服务器移动到另一个端口,并让一个面向端口80的小型轻量级C++web服务器解密HTTP post请求,然后将请求转发到本地主机上的普通web服务器,在那里它还将加密来自web服务器的响应。

让这种内联服务器类型的东西听起来可行吗?我在哪里可以找到任何对我有帮助的信息?例如,我正在努力寻找一个用C++编写的Linux小型web服务器示例,我不知道我应该做什么来只加密请求等的POST内容。

如果有更简单的解决方案,请提及。

PS。我基本上希望应用程序执行POST请求,例如http://sub.mysite.comPOST包含参数"request"answers"key"。例如,"Request"将是"mypage.php?param=value","key"将是应用程序的公钥,这两个参数都将使用应用程序附带的服务器的公钥加密。

PPS。如果有什么不同的话,我在Arch Linux上使用Nginx服务器。。。

我建议使用广泛使用且经过战斗验证的带有AES加密的mcryptPHP扩展:事情就是这样,请耐心等待,我必须从第一个请求开始。

  • 我想,您的帐户密码在DB:passhash=hash(accountsalt+accountpw)中进行了加盐和散列处理。帐户salt和用户名(或id)不是秘密
  • 当您首先连接到web服务时,让服务器返回帐户salt和服务器的当前UTC时间戳-这些都不是秘密,因此它可以通过简单的HTTP
  • 在客户端,使用服务器时间戳来计算或验证您的时间偏移并存储它,因此对于未来的请求,您可以访问客户端UTC时间戳,该时间戳非常接近服务器的时间戳
  • 现在请用户输入密码,然后在客户端计算passhash=hash(accountsalt+accountpw)
  • 生成一个随机的客户端会话salt,并记住更正后的客户端时间戳
  • 计算一个中间体:intermediate=hash(passhash+clientsessionsalt+timestamp)
  • 通过传输客户端会话salt、时间戳和中间值登录服务器:服务器应检查时间戳以避免重播攻击,然后计算服务器中间值-它必须与客户端中间值匹配。将其存储在会话中
  • 成功登录时,服务器必须返回服务器端会话salt(和会话ID)

现在我们已经准备好了一切,可以进行有效负载请求:我假设有效负载是一些二进制字符串(例如JSON)。因此,对于所有进一步的请求,

  • 注意已更正的客户端时间戳
  • 在客户端上,计算密钥:key=hash(serversessionsalt+timestamp+intermediate)
  • 使用密钥加密有效负载
  • 传输您的会话ID、时间戳和加密有效负载
  • 在服务器端,检查时间戳,然后使用它来计算相同的密钥
  • 使用此密钥使用mcrypt解密有效载荷-这应该很快

一些注意事项:

  • 如果需要,可以引入请求salt,以提供额外的保护,防止预计算攻击
  • 出于同样的理由,您可以让服务器定期更改会话salt,但如果使用异步请求,请小心
  • 时间戳是至关重要的:对于攻击者来说,他需要接近实时地破解哈希,这并非微不足道——这比最终破解要困难几个数量级
  • 虽然这不会为您提供服务器的身份证明,但它为您提供了保证,即服务器知道通行证哈希:伪造的服务器将无法计算密钥