SFTP与非基于文件的密钥

时间:2010-12-03 22:35:28

标签: c# c++ authentication sftp

我打算使用带有公钥/私钥认证的SFTP编写一些软件,将文件上传到服务器。我想知道人们如何推荐管理密钥(尤其是私钥)。

我的目标平台是带有C#或C ++的Windows。我看了很多图书馆:

C#
(自由/开放)
SharpSSH
Granados

(商业)
Rebex

C ++
libcurl/OpenSSH

所有这些似乎都要求私钥存储在文件系统上,出于安全原因,我宁愿避免使用。我也不想自己实现身份验证,尽管我认为这是一个选项。我的问题:

有没有办法直接从内存中提供任何这些库(或我可能忽略的任何库/ API)键值而不是从文件中加载?

如果没有,管理这些密钥文件的推荐方法是什么?除了密码加密和严格的访问控制之外,还有其他事情可以保护密钥文件吗?

4 个答案:

答案 0 :(得分:3)

  

所有这些似乎都需要   私钥存储在   文件系统,我更喜欢   出于安全原因避免使用。

我认为你应该拥抱文件系统。现代的NTFS(作为Windows开发人员,你几乎肯定会使用)具有强大的安全机制,可能比你(或我)可能设计的大多数替代机制更好地考虑。 NTFS具有访问控制列表,加密等等 - 如果您不能信任您的文件系统以保证数据安全,为什么还要关心网络流量呢?

我会注意到有一些特定的情况可能妨碍我做上面所说的,但我没有看到原帖中提到的任何一个。

答案 1 :(得分:0)

我从未使用Granados,但该库的SSH2UserAuthKey class有一个FromSECSHStyleStream方法,可以从任意Stream加载用户的身份验证密钥(可能是MemoryStream如果你想直接从内存加载密钥)。这似乎可以让你绕过文件系统进行密钥存储。

Rebex.Net有一个SshPrivateKey class constructor可以从byte[]加载;这也应该让你避免文件系统。

虽然我没有检查过其他库,但似乎所有这些库都提供了从byte[]MemoryStreamunsigned char*加载密钥的方法,方便直接从文件加载的方法。

但是,这些API并没有解决私钥实际存储的问题。您可以对其进行密码保护(这似乎是使用SSH私钥的一种相当常见的方法),或使用ProtectedData class使用当前Windows用户的凭据对其进行加密。

答案 2 :(得分:0)

SecureBlackbox(我们的产品)的

SFTP classes允许您从任何流或字节数组加载密钥。此外,它们还允许您以各种格式生成和转换SSH密钥。

如果您有任何疑问,我们会通过ForumHelpDesk

为评估用户提供支持

答案 3 :(得分:0)

以下代码显示了如何使用Rebex SFTP使用私钥进行身份验证。

代码取自forum post。有关详情,请查看SFTP tutorial

// create client and connect 
Sftp client = new Sftp();
client.Connect(hostname);

// instead of loading it from disk file load the private key from a byte array
//SshPrivateKey privateKey = new SshPrivateKey("key_rsa.pem", "password");

byte[] privateKeyData = YourMethodForObtainingPrivateKey();    
SshPrivateKey privateKey = new SshPrivateKey(privateKeyData, "password");

// authenticate 
client.Login(username, privateKey);

// ...