我打算使用带有公钥/私钥认证的SFTP编写一些软件,将文件上传到服务器。我想知道人们如何推荐管理密钥(尤其是私钥)。
我的目标平台是带有C#或C ++的Windows。我看了很多图书馆:
(商业)
Rebex
C ++
libcurl/OpenSSH
所有这些似乎都要求私钥存储在文件系统上,出于安全原因,我宁愿避免使用。我也不想自己实现身份验证,尽管我认为这是一个选项。我的问题:
有没有办法直接从内存中提供任何这些库(或我可能忽略的任何库/ API)键值而不是从文件中加载?
如果没有,管理这些密钥文件的推荐方法是什么?除了密码加密和严格的访问控制之外,还有其他事情可以保护密钥文件吗?
答案 0 :(得分:3)
所有这些似乎都需要 私钥存储在 文件系统,我更喜欢 出于安全原因避免使用。
我认为你应该拥抱文件系统。现代的NTFS(作为Windows开发人员,你几乎肯定会使用)具有强大的安全机制,可能比你(或我)可能设计的大多数替代机制更好地考虑。 NTFS具有访问控制列表,加密等等 - 如果您不能信任您的文件系统以保证数据安全,为什么还要关心网络流量呢?
我会注意到有一些特定的情况可能妨碍我做上面所说的,但我没有看到原帖中提到的任何一个。
答案 1 :(得分:0)
我从未使用Granados,但该库的SSH2UserAuthKey class有一个FromSECSHStyleStream
方法,可以从任意Stream
加载用户的身份验证密钥(可能是MemoryStream
如果你想直接从内存加载密钥)。这似乎可以让你绕过文件系统进行密钥存储。
Rebex.Net有一个SshPrivateKey class constructor可以从byte[]
加载;这也应该让你避免文件系统。
虽然我没有检查过其他库,但似乎所有这些库都提供了从byte[]
,MemoryStream
或unsigned char*
加载密钥的方法,方便直接从文件加载的方法。
但是,这些API并没有解决私钥实际存储的问题。您可以对其进行密码保护(这似乎是使用SSH私钥的一种相当常见的方法),或使用ProtectedData class使用当前Windows用户的凭据对其进行加密。
答案 2 :(得分:0)
SFTP classes允许您从任何流或字节数组加载密钥。此外,它们还允许您以各种格式生成和转换SSH密钥。
为评估用户提供支持答案 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);
// ...