在SSH.NET中检查SFTP/SSH指纹

h4cxqtbf  于 2023-03-24  发布在  .NET
关注(0)|答案(2)|浏览(161)

我目前正在创建一个SSIS包,我需要连接到一个安全的服务器来复制一些文件,我想通过服务器发送的公钥指纹来验证连接。
我对这方面不是很熟悉,我可以期待在连接时总是有指纹发送吗?
该软件包以前使用WinSCP,并以ssh-dss 1024 [hex representation]将指纹烘焙到代码中。我假设此格式来自PuTTY,因为这是我在连接到新服务器时看到的格式,并且它要求我进行验证。WinSCP按原样处理并处理验证。
我打算切换到SSH.NET,它的机制要求我手动检查指纹。我可以只根据十六进制来验证连接吗?还是还需要检查密钥长度和使用的算法?

drkbr07n

drkbr07n1#

你可以只根据十六进制来做-首先你要写(或复制/使用)一个实用程序方法来将十六进制字符串转换为字节数组(这取决于十六进制字符串的格式)-下面的例子是转换由冒号分隔的字符串(例如“1d:c1:5a:71:c4:8 e:a3:ff:01:0a:3b:46:17:6 f:e1:52”)

public static byte[] ConvertFingerprintToByteArray( String fingerprint )
{
    return fingerprint.Split( ':' ).Select( s => Convert.ToByte( s, 16 ) ).ToArray();
}

然后,您只需附加到SftpClient对象的HostKeyReceived事件。

SftpClient sftpClient = new SftpClient( Hostname, Username, Password );
sftpClient.HostKeyReceived += delegate ( object sender, HostKeyEventArgs e )
{
    var b = ConvertFingerprintToByteArray(
        "1d:c1:5a:71:c4:8e:a3:ff:01:0a:3b:46:17:6f:e1:52" );
    if( e.FingerPrint.SequenceEqual( b ) )
        e.CanTrust = true;
    else
        e.CanTrust = false;
};

如果此检查失败,则SSH.NET将抛出一个SshConnectionException-,并显示一条消息 “Key exchange negotiation failed”
希望这个有用。

k3bvogb1

k3bvogb12#

@ViniH的答案曾经是正确的,但现在已经过时了。现在,你需要使用SHA-256哈希,而不是MD5。要计算SHA-256,你可以使用System.Security.Cryptography.SHA256Managed classHostKeyEventArgs.HostKey
此外,您可能希望使用Convert.ToBase64String来获取SHA-256指纹的通用Base64表示

sftpClient.HostKeyReceived += (object sender, HostKeyEventArgs e) =>
{
    string sha256Fingerprint =
        Convert.ToBase64String(new SHA256Managed().ComputeHash(e.HostKey));
    e.CanTrust = (sha256Fingerprint == "1hI1HqP3IzoOWCABHGS7+GsrP2JUVsSs7oskK7HGP1E=");
};

如果你想比较完整的主机密钥(以你在OpenSSH known_hosts文件中看到的格式),只需Base64-encode the e.HostKey

Convert.ToBase64String(e.HostKey)

相关问题