【问题标题】:Transfer binary data securely using asynchronous sockets in C# / .Net在 C# / .Net 中使用异步套接字安全地传输二进制数据
【发布时间】:2013-08-20 17:32:18
【问题描述】:

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

新要求是对正在传输的数据进行加密。每个客户端连接都将提供一个加密密钥供服务器使用。实际的加密算法并不那么重要,即目标是简单地确保数据不会以明文形式发送。即使 RC2CryptoServiceProvider 具有 40 位密钥也足够了......与 RC2 相比,具有 128 位密钥的 RijndaelManaged 是一种过度杀伤并且相当占用 CPU 资源。

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

在动态加密文件中的数据以发送到套接字对等点时,是否有一些好的模式可以遵循?

【问题讨论】:

  • C# 到 C#?您应该使用 WCF。
  • 您将如何告诉您的客户用于加密数据的密钥?如果不是 HTTPS/SSL,那你就错了。
  • 使用 TLS,如有必要,使用 RC4 密码。
  • 我们在同一台机器上确实有另一个 WCF 服务器。该服务器是实际生成所需“内容”资源(图像、剪辑等)的服务器。当资源可用时,为了响应请求,WCF 回调将通过 keys 发送给客户端客户使用。实际传输不通过 WCF 执行 - 我们对二进制传输进行了基准测试,WCF 的开销有其惩罚。相反,我们的 TCP 套接字服务器使用异步重叠 I/O 来传输二进制内容...
  • 您想防范哪些类型的攻击?如果您将密钥与数据一起发送,即使是最简单的窃听攻击,加密也毫无用处。还是您有更具体的想法?

标签: c# .net sockets cryptography asyncsocket


【解决方案1】:

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

  • 基础设施:与您的客户端建立启用 SSL/TLSVPN。使用新的专用网络连接到您客户的网络。 专业版:代码几乎没有变化,具体取决于您当前的实现。 缺点:根据您客户(以及您的!)的基础架构,这可能是不可能的。

  • SSL:在客户端和服务器之间建立直接的安全套接字层连接。 专业版:易于实施。 CodeProject 上有一个关于如何通过 MS SSPI SSL 和 OpenSSL 实现它的示例,您可以将其用作您自己实现的基础; here's the link缺点:SSL 有some well-known security issues,在考虑实施之前您应该了解它。

  • 常用算法(AES、DES、Triple DES、Blowfish):您可以在通信层发送包之前和接收包之后使用的内部实现。 专业版:大量公开可用的库,some natively available since .NET 3.5 and up。缺点:正如你所提到的,有些可能是矫枉过正。

  • 自定义算法:创建您自己的!让这些位动摇。 专业版:随心所欲;公开可用的破解工具几乎没用。 There's an example here 用于 32 位整数的简单自定义加密协议,可轻松适应更大的内容。 缺点:公共算法经过彻底的测试和验证,确实确保了您的实施可能无法满足的安全级别;重新发明轮子没有什么正当理由。

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

【讨论】:

  • TLS 1.1 和 1.2 中的所有当前漏洞都只是理论上的,与您提到的其他方法中的问题相比绝对可以忽略不计。除非您是世界一流的密码学家团队,否则不可能从密码原语创建安全协议。创建自己的算法——更是如此。
  • 虽然大体上是正确的,但我相信您可能错过了 OP 的观点:根据他自己的话,“使用 128 位密钥管理的 Rijndael 对他的特定需求来说太过分了”。讨论的不是哪种方法更安全,他希望在加密和性能之间取得合理的平衡。
  • 问题在于,做一些非标准的事情会比遵循标准更困难,并且需要更多的工作。另请注意,IT 安全性是二元的——要么有安全性,要么没有。虚假的安全感比没有安全感更糟糕。
  • 在第一个话题上我有点同意你的看法。另一方面, 消除密码学的迷雾是件好事。它是一种工具,有各种尺寸的可用工具,如果你对自己想要的东西有足够的了解,你甚至可以自己成为工具制造者。但我完全同意 IT 安全性,我什至会补充说它是一个设置为 false 的二进制常量:没有安全系统 - 无论有人创建什么,只要有足够的时间和资源,其他人就可以破坏。尽管如此,仍有可接受的中间安全级别可以满足您的需求。
  • 只要私钥保持私密,就不可能破坏(正确实施的)PGP 或 TLS 等标准。您可能正在考虑暴力破解,但这不被认为是可行的攻击,因为我们正在谈论具有足够密钥长度的数十亿年时间。而且我仍然认为安全性是布尔值。中间级别的安全几乎总是只是混淆。
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 2010-11-16
  • 1970-01-01
  • 2014-03-16
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多