【问题标题】:Asymmetrical TCP encryption C#非对称 TCP 加密 C#
【发布时间】:2012-07-09 03:26:17
【问题描述】:

我想编写一个使用 tcp 套接字进行通信的客户端和服务器应用程序。但是我不需要证书,因为用户不在乎对方是谁。但我确实需要非对称加密,所以没有人可以窥探。我想不出使用 RSA 共享对称密钥的方法,但无论如何我认为我应该使用 SSL 和 TCP?

在 C# 中创建 SSL/TCP 连接的最常用方法是什么?我想我要么不指定证书,要么动态创建其中一个(但它们应该是一次性的......)。实现它的最简单方法是什么?我尝试简单地将 sslstream 添加到我的 tcp 流中,但这并没有削减它(我得到流不可读错误)。到目前为止,这是我的简单代码

    {
        Thread serverThread = new Thread((ThreadStart)delegate
        {
            TcpListener listener = new TcpListener(1234);
            listener.Start();
            using (TcpClient client = listener.AcceptTcpClient())
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                string inputLine;
                while ((inputLine = reader.ReadLine()) != null)
                {
                    writer.WriteLine(inputLine);
                }
            }
        });
        serverThread.Start();
        {
            string[] linesToSend = new string[] { "foo", "bar", "ack" };
            using (TcpClient client = new TcpClient("127.0.0.1", 1234))
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                foreach (string lineToSend in linesToSend)
                {
                    Console.WriteLine("Sending to server: {0}", lineToSend);
                    writer.WriteLine(lineToSend);
                    string lineWeRead = reader.ReadLine();
                    Console.WriteLine("Received from server: {0}", lineWeRead);
                    //Thread.Sleep(2000); // just for effect
                }
                Console.WriteLine("Client is disconnecting from server");
            }
        }
        serverThread.Join();
    }

【问题讨论】:

  • 如果你想受到 MITM 攻击的保护,你总是需要检查服务器的身份。 (不验证证书最多只能保护您免受被动窃听。)

标签: c# .net encryption ssl tcp


【解决方案1】:

您需要为LocalCertificateSelectionCallback 提供一个实现以选择要使用的证书,并且您需要为RemoteCertificateValidationCallback 提供一个实现以接受对等方使用的自签名证书。

要创建自签名证书(即一次性),请参阅Creating a self-signed certificate in C#

Using SSL and SslStream for peer to peer authentication 上也有一个关于 SO 的分步示例。

确保您理解其中的含义,即。中间人可能会降低您的流量,因为您实际上并未验证所提供的证书。换句话说,这根本不是 authentication 的一种形式(如 SO 链接答案中所建议的那样),而只是一种与 somebody 进行私人通信的方式,但你不真的不知道到底和谁在一起。另一种方法是使用根证书来签署每个使用的一次性证书并验证客户端中的证书链,但与博客链接相比,这会使证书的生成变得非常复杂。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 2019-07-29
    • 1970-01-01
    • 2011-11-24
    • 2010-10-30
    • 2017-02-22
    • 2011-03-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多