我目前正在寻找在 C# 客户端和服务器应用程序之间建立有状态和加密连接的最佳方法。首先,我考虑过使用 IPsec,但由于它在低级别(OSI:Internet 层)上工作,如果您想要程序中的功能并且不想依赖操作系统,我将很难实现。
为此,您会推荐哪些技术?.NET (4.5) 中是否已经内置了一些功能?它不一定是有状态的,使用某种心跳也是一个有效的选择。
我目前正在寻找在 C# 客户端和服务器应用程序之间建立有状态和加密连接的最佳方法。首先,我考虑过使用 IPsec,但由于它在低级别(OSI:Internet 层)上工作,如果您想要程序中的功能并且不想依赖操作系统,我将很难实现。
为此,您会推荐哪些技术?.NET (4.5) 中是否已经内置了一些功能?它不一定是有状态的,使用某种心跳也是一个有效的选择。
您将希望使用标准协议,例如 SSL,而不是尝试自己制作。首先,实现会容易得多,因为 .NET 框架将支持它,并且在它下面运行的传输协议是有状态的(例如 TCP)。其次,开发一个安全的加密协议是非常困难的,而且 SSL 已经实现了,为什么要重新发明轮子呢?
SSL 通过使用 PKI(公钥基础设施)来生成共享对称密钥。握手由多个步骤组成。首先客户端发送一个安全会话请求,然后服务器用它的证书进行响应,客户端通过证书颁发机构(例如 Verisign、Thawte、GeoTrust 等)爬上梯子来验证证书,或者如果它已经信任服务器可以只接受自签名的证书......一旦它发现证书是值得信赖的,它就会生成一个对称密钥并选择一个算法(例如 AES、3DES、RC4、IDEA 等......)。然后客户端加密与公钥一起使用的密钥和算法,然后客户端将该值发送到服务器,并且可以使用更快的对称加密进行安全会话。
SSL 本身可以以有状态的方式使用,因为它实际上在 OSI 模型中的传输层上工作,另一方面,HTTPS 在设计上不是有状态的协议。HTTPS 是基于 SSL 的 HTTP,因此两者在技术上实际上并没有任何关系,除了在 HTTPS 中 SSL 用于保护所请求的应用程序数据。使用 HTTPS 和使用 HTTP 一样,一旦向服务器发出请求,它基本上就会忘记你(不完全是它是如何发生的,但出于所有意图和目的,你可以这样想)。如果您可以绕过有状态协议,我自己更喜欢使用 HTTPS。这样做的主要原因是我不必编写代码并且可能在 SSL 的实现中出错。
话虽如此,如果您仍想在应用程序级别创建自己的不使用 HTTP 的 SSL 服务器,您可以使用 TcpListener 和 TcpClient 类以及作为 .NET 的一部分提供的 SslStream 类来创建您自己的。MSDN 有一个很好的例子来说明如何创建 SSL 服务器和客户端:http: //msdn.microsoft.com/en-us/library/system.net.security.sslstream%28v=vs.110%29.aspx
旁注
只需在应用程序之间建立一个常规的 TCP 连接,并编写一个简单的数据包协议(EG,4 个字节表示数据包大小,然后是数据包数据)
除了这个基础数据包中的数据是通过加密的System.Cryptography.AesManaged
如果您在使用 AesManaged 加密数据包时遇到问题,请尝试使用The Encryptamajig - 如果这没有帮助,请发布更多问题,我们将为您提供进一步的具体帮助。
-- 您可以让双方提前知道密码(例如,亲自告诉另一端的人密码),或者在连接开始时快速传递未加密的密码(或者,更确切地说,使用默认加密已知密码)
不一定是最好的方法,但它应该可以完成这项工作。
为什么不只是常规的 HTTPS?HTTP 仅比 TCP 高一个级别,但使用起来要容易得多,而且防火墙在 HTTP/HTTPS 端口(即 80 和 443)上通常很容易。当然,纯 HTTP 不适合您,但您可以不使用 HTTPS 代替想出自己的加密通信机制?在客户端(C#)中,HttpClient 等所有 .NET 类都很好地支持 HTTPS。我引用Ayende来支持我使用 HTTP 的建议 :)