0

SSL 对于我想做的事情来说似乎很臃肿,而且我对 OpenSSL 怀有强烈的仇恨(NSS 可能是可用的)。我需要在两个节点之间打开一个 TCP 通道,用于 RPC / 加密 RPC / 事件流 / 加密事件流。我正在使用协议缓冲区来定义和多路复用不同的流量源。

我不想从 SSL 开始。我需要经过身份验证的安全密钥建立(经过身份验证的 diffie-hellman),然后可能需要一个基于块密码的流对象来加密和解密加密的事件流和加密的 RPC。

我的第一个想法是,通过构建 SSL 实现来节省编码时间和设计时间,前提是我可以从 SSL 实现中获取套接字句柄并将其用于未加密交换和加密交换。但这可能最终会成为一个丑陋的实现,据我所知,这样做可能与 ssl 协议不兼容(即 TCP 状态和 SSL 状态之间的强耦合)。

我的第二个想法是,通过打开多个套接字来节省编码时间和设计时间。但众所周知,多套接字协议设计是邪恶的。

第三个想法是,我将加密所有内容,但有问题的服务以高性能事件交换机的能力提供服务,并且它还在同一台机器上运行了一个数据库服务器。这种方法的开销并不令人满意,因为大部分流量都是明文。

所以,这些方法对我来说似乎并不令人满意。因此,我得出的结论是,使用 cryptopp 和 boost::asio 我可以推出自己的解决方案并构建自己的协议(我已经必须这样做)。我是一个非常有能力的系统程序员,并且我有一位了解应用加密技术的工程师。

我完全支持重用,在这种情况下,我希望我可以重用 SSL,但我认为我不能。您可以根据您在类似情况下的经验(您必须设计或使用过网络协议)给我任何建议,我们将不胜感激。给我留下最深刻印象的建议得到了打勾。:D

ps,我的应用程序还需要执行一些奇异的加密,无论如何我都在使用cryptopp。

4

1 回答 1

0

您当然可以重用 SSL - 与 TCP 状态没有不良耦合。你可以在你喜欢的任何底层流上使用 SSL,唯一的依赖是它必须是双向的。

最简单的方法是使用 SSL 库,该库允许您提供自己的发送/接收函数,以便在 SSL 库有要发送或接收的加密端数据时调用。然后,您将通过将 SSL 数据包装在您自己的底层协议中的特殊帧中来实现这些功能。

(我只熟悉 OpenSSL 库是如何做到这一点的——SSL_set_bio()函数——但我确信其他 SSL 实现允许类似的东西)。

请注意,尽管协议的密钥协议部分的计算开销——无论是通过 SSL 还是自己滚动完成——都将远远超过实际的分组密码加密/解密,因此“加密所有内容”可能不会那么重要损失如你所料。

于 2011-02-10T00:36:03.817 回答