c++ - RFC/建议 : On secure/unsecure rpc/event-stream protocol design

标签 c++ ssl tcp cryptography systems-programming

对于我想做的事情,SSL 似乎很臃肿,我对 OpenSSL 有强烈的仇恨(NSS 可能有用)。我需要在将用于 RPC/加密 RPC/事件流/加密事件流的两个节点之间打开一个 TCP channel 。我正在使用 Protocol Buffer 来定义和多路复用不同的流量源。

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

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

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

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

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

我完全赞成重用,在这种情况下我希望我可以重用 SSL,但我认为我做不到。如果您能根据您在类似情况下的经验(您必须设计或使用过网络协议(protocol))给我提供任何建议,我们将不胜感激。给我留下最深刻印象的建议很重要。:D

p.s.,我的应用程序还需要执行一些特殊的加密,无论如何我都会为此引入 cryptopp。

最佳答案

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

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

(我只熟悉 OpenSSL 库如何执行此操作 - SSL_set_bio() 函数 - 但我确信其他 SSL 实现允许类似的操作)。

请注意,尽管协议(protocol)的 key 协商部分的计算开销——无论是通过 SSL 还是自行完成——将远远超过实际的分组密码加密/解密,因此“加密所有内容”可能不像如您所料,损失很大。

关于c++ - RFC/建议 : On secure/unsecure rpc/event-stream protocol design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4945573/

相关文章:

ssl - Worklight 适配器相互 SSL

ssl - 如何将 .crt 文件转换为 .pem 格式

java - 在 C 中以\0 结尾的串联字符串

c++ - 在指针上同时使用前缀和后缀时出现奇怪的输出

c++ - 如何将分配器与 std::set 一起使用?

c++ - 从给定的图像数据中提取像素数据。需要帮助理解代码

security - 如果客户端已经有服务器证书,SSL 握手/协议(protocol)如何工作?

java - 如何在Java中关闭来自服务器的TCP连接

tcp - 为什么 bgp 打开和通知数据包只在 ODL 中流动

c++ - 在构造函数中初始化嵌套成员的语法?