2011-02-09 57 views
0

SSL看起来非常臃肿,我想做的事情,我对OpenSSL充满激情仇恨(NSS可能是可用的)。我需要在两个节点之间打开一个用于RPC /加密RPC /事件流/加密事件流的TCP通道。我正在使用协议缓冲区来定义和复用不同的流量来源。RFC /建议:关于安全/不安全的rpc /事件流协议设计

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

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

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

第三个想法是,我只是加密一切,但所讨论的服务服务于高性能事件开关的能力,并且它具有在同一台机器上运行的数据库服务器。这种方法的开销不能满足,因为大多数流量都是明文的。

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

我都重复使用,在这种情况下,我希望我可以重用SSL,但我不认为我可以。任何建议,你可以给我从你的经验在类似的情况下(你必须设计或在网络协议工作),将不胜感激。对我产生最大印象的建议会得到嘀嗒。:D

p.s.,我的应用程序还需要执行一些我正在使用cryptopp的异域加密。

+0

我不知道你是什么意思的“臃肿”,但它听起来像你试图重新创建SSL。事实上,你在你的问题上做了很多假设。事实上,您可以在已连接的TCP连接上层叠SSL连接,许多SSL升级协议都依赖于这种行为。 – 2011-02-10 00:19:22

回答

0

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

最简单的方法是使用SSL库,该库允许您提供自己的发送/接收函数,以便SSL库在加密端发送或接收数据时调用它。然后,您将通过将SSL数据包装在您自己的底层协议中的特殊框架中来实现这些功能。我只熟悉OpenSSL库如何执行此操作 - SSL_set_bio()函数 - 但我确信其他SSL实现允许类似的操作)。

请注意,协议的密钥协议部分的计算开销 - 无论是通过SSL还是自己的 - 都将远远超过实际的分组密码加密/解密,因此“加密所有内容”可能不是如你所期望的那么大。

+0

打开的套接字将保持不变,因此密钥交换开销将最小,并且节点始终存在于安全网络中。我只需要密钥交换,安全通道和简单身份验证(通过安全通道的明文密码就足够了)。非常欢迎SSL套接字和TCP套接字松散耦合的见解,谢谢。在我自己和重复使用SSL之间,我仍然很勉强。 Boost :: asio支持openssl,大多数机器都安装了SSL。由于存在很多重叠,我只是觉得在cryptopp + SSL依赖方面非常愧疚。 – 2011-02-11 12:41:36