使用具有强密码的 SSH.NET

Mar*_*uiz 5 .net ssh cryptography

我们公司有一个项目,我们使用库 SSH.NET (2016.1.0) 连接到远程服务器。我们建立的连接非常简单,代码如下:

var sftpClient = new Renci.SshNet.SftpClient(host,port,user,password);
Run Code Online (Sandbox Code Playgroud)

然后我们执行查找文件、下载和上传等操作。

今天,我们收到了一封来自我们连接的服务器人员的电子邮件,告诉我们他们将停止使用弱密码,恐怕这不是我有经验的领域。

根据他们的沟通,他们的新 SSH (SFTP) 标准将是:

协议簇标准允许的密码:

  • aes256-ctr
  • aes128-ctr

允许的 MAC:

  • hmac-sha-512
  • hmac-sha-256
  • hmac-sha1

允许的 KEX 密码:

  • 迪菲-赫尔曼-组交换-sha256
  • 迪菲-赫尔曼-group14-sha1

我检查了网站上最新版本的 SSH.Net,他们似乎支持这些(https://github.com/sshnet/SSH.NET/tree/2020.0.1)。

现在,我的问题是如何使用正确的密码正确使用这个库?我还没有找到任何关于如何指定这些设置的示例。

Art*_* B. 4

TL;DR 您无需执行任何操作即可建立连接,只要客户端和服务器都支持每个类别(加密、MAC、密钥交换等)中至少有一种算法即可。

RFC4253第7章描述了SSH 2.0的密钥交换协议:

密钥交换 (kex) 从双方发送支持的算法的名称列表开始。每一方在每个类别中都有一个首选算法,并且假设大多数实现在任何给定时间都将使用相同的首选算法。每一方可以猜测另一方正在使用哪种算法,并且可以根据该算法发送初始密钥交换数据包(如果适合首选方法)。

第 6.3 章有这样的说法:

每个方向上的密码必须彼此独立运行。如果本地策略允许多种算法,则实现必须允许独立选择每个方向的算法。然而在实践中,建议在两个方向上使用相同的算法。

这意味着客户端和服务器分别为每个类别选择对方必须理解的算法。所选择的算法必须得到双方的支持。

在算法协商期间,两个列表都会交换。由于 SSH.NET 支持您服务器的算法,因此将选择这些算法。

有些算法比其他算法更好,但您无法更改 SSH.NET 中的优先级,因为该类ConnectionInfo使用s Dictionary来配置支持的算法。ADictionary具有非确定性排序,但 SSH 协议选择列表中较高的算法。

Dictionary不过,您可以在传递之前自行ConnectionInfo更改内容SftpClient