2010-12-03 65 views
1

我打算写一些软件使用公钥/私钥身份验证SFTP上传文件到服务器。我想知道人们如何推荐管理密钥(尤其是私钥)。SFTP与非文件的密钥

我的目标平台是使用C#或C++的Windows。我已经看了许多库:

C#
(自由/开放)
SharpSSH
Granados

(商业)
Rebex

C++
libcurl/OpenSSH

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

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

如果不是,建议如何管理这些密钥文件?除了密码加密和严格的访问控制之外,还有其他一些事情应该如何保护密钥文件?

回答

0

我从来没有用过格拉纳多斯,但该库的SSH2UserAuthKey class具有从任意Stream加载用户的认证密钥(这可能是一个MemoryStream,如果你想直接从内存中加载密钥)对FromSECSHStyleStream方法。看起来这会让你绕过关键存储的文件系统。

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

虽然我没有检查其他图书馆,它很可能是所有的人都将提供方法来加载从byte[]MemoryStream,或unsigned char*的关键,直接从文件加载方便的方法。但是,这些API并不能解决私钥如何存储的问题。您可以使用密码保护它(这似乎是使用SSH私钥的一种常见方法),或者使用ProtectedData class以当前Windows用户的凭据对其进行加密。

0

SFTP classes SecureBlackbox(我们的产品)可让您从任何流或字节数组中加载密钥。此外,他们还允许您以各种格式生成和转换SSH密钥。

如果你有问题,我们通过Forum以评估用户提供支持和HelpDesk

3

所有这些似乎需要 私有密钥被存储在 文件系统,我宁愿 避免出于安全原因。

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

我会注意,有可能妨碍做什么我上面说的一些具体情况,但我没有看到在原岗位的任何人提及。

+0

谢谢你,约翰。我不能为此争辩太多。我提出这个问题是因为我被迫要找到一种解决方案来保护这一点,即使是在机器上具有管理权限的不良演员。 – 2010-12-16 19:52:53

0

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

代码会从以下forum post拍摄。欲了解更多信息,请查询SFTP tutorial

​​