在C#/.Net中使用异步套接字安全地传输二进制数据

在C#/.Net中使用异步套接字安全地传输二进制数据,c#,.net,sockets,cryptography,asyncsocket,C#,.net,Sockets,Cryptography,Asyncsocket,我们有一个用C语言编写的TCP/IP套接字服务器,用于将二进制文件传输到客户端。e、 例如,剪辑、图像。使用带有回调的异步BeginSend/EndSend发送字节[]缓冲区 新的要求是对传输的数据进行加密。每个客户端连接都将提供一个加密密钥供服务器使用。实际的加密算法并不是那么重要,也就是说,目标只是确保数据不以明文形式发送。即使是具有40位密钥的RC2CryptoServiceProvider也足以。。。与RC2相比,使用128位密钥管理的RijndaelManager是一种过度杀伤力,而且

我们有一个用C语言编写的TCP/IP套接字服务器,用于将二进制文件传输到客户端。e、 例如,剪辑、图像。使用带有回调的异步BeginSend/EndSend发送字节[]缓冲区

新的要求是对传输的数据进行加密。每个客户端连接都将提供一个加密密钥供服务器使用。实际的加密算法并不是那么重要,也就是说,目标只是确保数据不以明文形式发送。即使是具有40位密钥的RC2CryptoServiceProvider也足以。。。与RC2相比,使用128位密钥管理的RijndaelManager是一种过度杀伤力,而且需要占用大量CPU

当然,在传输数据文件之前,可以先生成数据文件的加密版本。理想情况下,当数据从文件中读取并通过套接字发送时,我们应该动态加密文件。考虑到数据文件的大小,将整个文件内容读取到内存既不高效也不可扩展


在动态加密文件中的数据以发送给套接字对等方时,有几种好的模式可以遵循吗?

有几种方法可以实现这一点。以下是一些:

  • 基础设施:与客户端建立启用SSL/TLS的VPN。使用新的专用网络连接到客户端的网络Pro:根据您当前的实现,代码几乎没有变化Con:根据您的客户(和您的客户!)的基础架构,这可能是不可能的

  • SSL:在客户端和服务器之间建立直接的安全套接字层连接Pro:易于实施。CodeProject上有一个示例,介绍了如何通过mssspi-SSL和OpenSSL实现它,您可以将其用作自己实现的基础Con:在考虑实施SSL之前,您应该了解SSL

  • 通用算法(AES、DES、Triple-DES、Blowfish):在通信层上发送包之前和接收包之后可以使用的内部实现Pro:公共可用库的加载。缺点:正如你所提到的,有些可能是杀伤力过大

  • 自定义算法:创建自己的算法!把那些东西摇一摇Pro:它可以轻到你想要的程度;公共可用的破解工具几乎毫无用处。一个简单的自定义加密协议,用于32位整数,易于适应较大的内容Con:公共算法经过彻底测试和验证,确保实现可能无法达到的安全级别;没有什么合理的理由来重新发明轮子


当然,如果您想要额外的安全性(例如,通过SSL连接的AES加密内容),您可以混合使用两种或更多种,但这取决于您的决定。

C到C?你应该使用WCF。你将如何告诉你的客户数据加密使用的密钥?如果不是HTTPS/SSL,您就错了。只需使用TLS,必要时使用RC4密码。我们在同一台机器上有另一台WCF服务器。此服务器实际生成所需的“内容”资源(图像、剪辑等)。当资源可用时,为了响应请求,会向客户端发出WCF回调,其中包含供客户端使用的密钥。实际的传输不是通过WCF执行的——我们对二进制传输进行了基准测试,WCF的开销也会受到惩罚。相反,我们的TCP套接字服务器使用异步重叠I/O传输二进制内容……您希望防范什么类型的攻击?如果您将密钥与数据一起发送,即使是最简单的窃听攻击,加密也毫无用处。或者你有更具体的想法吗?与你提到的其他方法相比,TLS 1.1和1.2中的所有当前漏洞都只是理论上的,而且绝对可以忽略不计。除非您是一个世界级的密码学家团队,否则不可能从加密原语创建安全协议。创建自己的算法——甚至更是如此。虽然总体上是正确的,但我相信你可能没有抓住OP的要点:根据他自己的话,“RijndaelManaged with 128 bit key是一种过度使用”来满足他的特定需求。讨论的不是哪种方法更安全,他希望在加密和性能之间取得合理的平衡。问题是做一些非标准的事情将比使用标准更困难,涉及更多的工作。还要注意,IT安全性是一个二元的东西——要么有安全性,要么没有安全性。虚假的安全感比没有安全感更糟糕。在第一个话题上,我可以有点同意你。另一方面,消除误解是好的;这是一种工具,有各种尺寸的可用工具,如果你对自己想要的东西有足够的了解,你甚至可以自己做一个工具制造者。但我完全同意IT安全性,我甚至会补充说,这是一个设置为false的二进制常量:没有安全的系统-无论有人创建什么,只要有足够的时间和资源,其他人都可以破坏。尽管如此,仍有可接受的中级安全级别可以满足您的需求。只要私钥保持私密,就不可能违反(正确实施)PGP或TLS等标准。您可能会考虑使用暴力强制,但这并不是一种可行的攻击,因为我们讨论的是数十亿年的时间和足够的密钥长度。我仍然认为安全性是布尔的。中间级别的安全性几乎总是模糊的。