Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ RFC/建议:关于安全/不安全rpc/事件流协议设计_C++_Ssl_Tcp_Cryptography_Systems Programming - Fatal编程技术网

C++ RFC/建议:关于安全/不安全rpc/事件流协议设计

C++ RFC/建议:关于安全/不安全rpc/事件流协议设计,c++,ssl,tcp,cryptography,systems-programming,C++,Ssl,Tcp,Cryptography,Systems Programming,对于我想做的事情,SSL似乎过于臃肿,我对OpenSSL有着强烈的仇恨(NSS可能是可用的)。我需要在两个节点之间打开一个TCP通道,该通道将用于RPC/加密RPC/事件流/加密事件流。我使用协议缓冲区来定义和多路传输不同的流量源 我不想首先使用SSL。我需要经过身份验证的安全密钥建立(经过身份验证的diffie hellman),然后可能需要一个基于分组密码的流对象来加密和解密加密的事件流和加密的RPC 我的第一个想法是,通过构建SSL实现来节省编码时间和设计时间,前提是我可以从SSL实现获得

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

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

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

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

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

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

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


p、 在美国,我的应用程序还需要执行一些特殊的加密,我正在使用cryptopp进行加密。

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

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

(我只熟悉OpenSSL库是如何做到这一点的,
SSL\u set\u bio()
函数,但我确信其他SSL实现也允许类似的功能)


但是请注意,协议中密钥协议部分的计算开销(无论是通过SSL还是自行滚动)将远远超过实际的分组密码加密/解密,因此“加密所有内容”可能不会像您预期的那样造成太大损失。

我不知道您所说的“臃肿”是什么意思但听起来您似乎在试图重新发明SSL。事实上,你在你的问题中做了很多假设。事实上,您可以在已连接的TCP连接上分层SSL连接,许多SSL升级协议都依赖于此行为。打开的套接字将是持久的,因此密钥交换开销将最小,并且节点始终存在于安全网络中。我只需要密钥交换、安全通道和简单身份验证(安全通道上的明文密码就足够了)。SSL套接字和TCP套接字是松散耦合的,这是值得欢迎的,谢谢。我仍然在使用自己的SSL和重用SSL之间左右为难。asio支持openssl,大多数机器都安装了SSL。我只是觉得对cryptopp+SSL的依赖性很内疚,因为有很多重叠。