如何在两个C#应用程序之间创建有状态加密连接?

如何在两个C#应用程序之间创建有状态加密连接?,c#,.net,encryption,network-programming,C#,.net,Encryption,Network Programming,我目前正在寻找在C#客户端和服务器应用程序之间建立有状态加密连接的最佳方法。首先,我考虑过使用IPsec,但由于它在低级别(OSI:Internet层)上工作,如果您想在程序中实现功能,而不想依赖操作系统,我将很难实现 为此,您会推荐哪些技术?.NET(4.5)中是否已经内置了一些功能?它不一定必须是有状态的,使用某种心跳也是一种有效的选择。只需在应用程序之间形成一个常规TCP连接,并编写一个简单的数据包协议(例如,4个字节表示数据包大小,后面是数据包数据) 除了此基本级别数据包中的数据通过 如

我目前正在寻找在C#客户端和服务器应用程序之间建立有状态加密连接的最佳方法。首先,我考虑过使用IPsec,但由于它在低级别(OSI:Internet层)上工作,如果您想在程序中实现功能,而不想依赖操作系统,我将很难实现


为此,您会推荐哪些技术?.NET(4.5)中是否已经内置了一些功能?它不一定必须是有状态的,使用某种心跳也是一种有效的选择。

只需在应用程序之间形成一个常规TCP连接,并编写一个简单的数据包协议(例如,4个字节表示数据包大小,后面是数据包数据)

除了此基本级别数据包中的数据通过

如果您在使用AesManaged加密数据包时遇到问题,请尝试使用-如果没有帮助,请发布进一步的问题,我们将为您提供进一步的具体帮助

--您可以让双方提前知道密码(例如,亲自告诉另一端的人密码),或者在连接开始时不加密地快速传递密码(或者,更确切地说,使用默认的已知密码加密)


不一定是最好的方法,但它应该可以完成这项工作。

只需在应用程序之间建立一个常规TCP连接,并编写一个简单的数据包协议(例如,4个字节表示数据包大小,后面是数据包数据)

除了此基本级别数据包中的数据通过

如果您在使用AesManaged加密数据包时遇到问题,请尝试使用-如果没有帮助,请发布进一步的问题,我们将为您提供进一步的具体帮助

--您可以让双方提前知道密码(例如,亲自告诉另一端的人密码),或者在连接开始时不加密地快速传递密码(或者,更确切地说,使用默认的已知密码加密)


不一定是最好的方法,但它应该可以完成这项工作。

为什么不仅仅是常规的HTTPS?HTTP仅比TCP高一级,但使用起来要容易得多,而且在HTTP/HTTPS端口(即80和443)上,防火墙通常比较容易。当然,普通HTTP不适合您,但是您不能使用HTTPS来代替自己的加密通信机制吗?在客户端(C#),所有.NET类(如HttpClient)都非常支持HTTPS。我引用这句话来支持我的建议:使用HTTP:)

为什么不使用常规的HTTPS?HTTP仅比TCP高一级,但使用起来要容易得多,而且在HTTP/HTTPS端口(即80和443)上,防火墙通常比较容易。当然,普通HTTP不适合您,但是您不能使用HTTPS来代替自己的加密通信机制吗?在客户端(C#),所有.NET类(如HttpClient)都非常支持HTTPS。我引用这句话来支持我关于使用HTTP:)的建议。

您将希望使用标准协议,如SSL,而不是尝试创建自己的协议。首先,实现会容易得多,因为.NET framework将支持它,并且在它下面运行的传输协议是有状态的(例如TCP)。其次,开发一个安全的加密协议非常困难,而且SSL已经实现了,那么为什么要重新发明轮子呢

SSL的工作原理是使用PKI(公钥基础设施)生成共享对称密钥。握手包括许多步骤。首先,客户端发送安全会话请求,然后服务器用其证书响应,客户端通过证书颁发机构(如Verisign、Thawte、GeoTrust等)爬上阶梯验证证书,或者如果它已经信任服务器,则只需接受自签名的证书即可。。。。一旦发现证书是可信的,它将生成对称密钥并选择算法(例如AES、3DES、RC4、IDEA等)。然后,客户端对公钥使用的密钥和算法进行加密,然后客户端将该值发送到服务器,安全会话可以使用更快的对称加密进行

SSL本身可以以有状态的方式使用,因为它实际上在OSI模型的传输层上工作,而HTTPS在设计上不是有状态的协议。HTTPS是HTTP over SSL,因此从技术上讲,这两个协议实际上没有任何关系,只是在HTTPS中,SSL用于保护被请求的应用程序数据。对于HTTPS和HTTP,一旦向服务器发出请求,它基本上会忘记您(不完全是如何发生的,但出于所有目的,您可以这样想)。我本人更喜欢使用HTTPS,如果你可以绕过有状态协议。这样做的主要原因是,我不必编写代码,也不必在SSL的实现中出错。您所要做的就是构建一个在IIS上运行的WCF或基于REST的服务,并为您的服务器获取证书

也就是说,如果您仍然希望创建自己的SSL服务器,而不在应用程序级别使用HTTP,那么您可以使用TcpListener和TcpClient类以及作为.NET一部分提供的SslStream类来创建自己的SSL服务器。MSDN提供了一个创建SSL服务器和客户端的好例子:

旁注

  • 确保数据传输的安全并不能确保应用程序的安全,请不要错误地认为您获得了自动安全性
  • 如果您选择创建自己的服务器和客户端,您可以使用它生成证书,也可以使用.NET的一部分来创建证书
您将希望使用标准协议,如SSL,而不是尝试创建自己的协议。首先,实现会容易得多,因为