在C#Desktop App中存储我的亚马逊凭证

时间:2009-07-21 18:51:19

标签: c# .net amazon-s3 amazon-web-services

我正在寻找在桌面应用程序中使用Amazon S3和simpleDB。

我遇到的主要问题是我需要在应用程序中存储我的aws凭据或使用其他方案。

我猜测将它们存储在应用程序中是不可能的,因为它们很容易被选中。

另一种选择是创建一个创建aws身份验证签名的Web服务,但这有其自身的问题。 签名是否需要上传文件中的所有数据?如果是这样,我将不得不两次传输所有数据。 然后会出现一个中心故障点,这是使用aws的主要原因之一。

有什么想法吗?

更新

我需要让我更清楚一点,我想将我的aws凭证存储在分发给他人的应用程序中。 DPAPI或任何其他加密只会阻止人们使用反射器来获取凭据。使用任何加密仍然需要容易获得的密钥。

更新2 - 2011年9月

亚马逊发布了一些有关使用AWS Security Token Service的详细信息,该服务允许在不泄露您的密钥的情况下进行身份验证。有关详细信息,请访问this blog post

4 个答案:

答案 0 :(得分:10)

蒂姆,你确实在采取两种主要方法:

  1. 不够好:将“秘密”秘密密钥存储在应用程序中。某人只是从应用程序代码中挑出它确实存在严重风险。一些缓解措施可能是(a)使用DPAPI将密钥存储在应用程序二进制文件之外,或者(b)每次需要时通过网络服务获取密钥(通过SSL),但绝不将其存储在本地。没有缓解可以真正减慢使用调试器的有能力的攻击者,因为明文密钥必须最终在应用程序的RAM中。

  2. 更好:将需要保护的内容推送到您的网络服务并在那里签名。好消息是只需要签名请求名称和时间戳 - 而不是所有上传的位(我猜亚马逊不想花费周期来验证所有这些位!)。以下是亚马逊自己的“Introduction to AWS for C# Developers”的相关代码行。注意如何使用“PutObject”和时间戳来调用Aws_GetSignature?您绝对可以在自己的Web服务上实现签名,而无需发送整个文件并且不会损害您的密钥。如果您想知道,Aws_GetSignature是一个9行函数,它在常量字符串“AmazonS3”,操作名称和时间戳的RFC822表示的串联上执行SHA1哈希 - 使用您的秘密键。

    DateTime timestamp = Aws_GetDatestamp();
    string signature = Aws_GetSignature( "PutObject", timestamp );
    byte[] data = UnicodeEncoding.ASCII.GetBytes( content );
    service.PutObjectInline( "MainBucket", cAWSSecretKey, metadata,
            data, content.Length, null,
            StorageClass.STANDARD, true,
            cAWSAccessKeyId, timestamp, true,
            signature, null );
    
  3. 编辑:请注意,虽然您可以隐藏您的Amazon身份的密钥部分,但访问密钥ID部分需要嵌入到请求中。除非您通过自己的网络服务发送文件,否则您必须将其嵌入应用程序。

答案 1 :(得分:0)

我遇到的主要问题是我需要在应用程序中存储我的aws凭据或使用其他方案。

Windows是否拥有类似于Apple的Keychain Manager的系统级服务?如果是这样,请将凭据放在那里。如果没有,也许您可​​以构建一个淡化版本来存储AWS证书的高度加密版本。

签名是否需要上传文件中的所有数据?

HMAC SHA-1签名是HTTP请求标头的编码加密。此签名是一个哈希值,相对于您的数据而言非常短,只有20个字节长。

答案 2 :(得分:0)

您可以加密配置文件和/或使用ProtectedData。 Here's my blog post on both

更新:作为安装步骤的一部分,您可能会加密app.config。此处示例:http://www.codeproject.com/KB/security/encryptstrings.aspx。不是很好,但到目前为止我发现的最好。

答案 3 :(得分:0)

您是否允许任何获取程序副本的人访问S3 / SimpleDB上的数据?如果没有,您将需要自己的身份验证方案,该方案独立于AWS安全性。

在这种情况下,您可以实现一个Web服务,该服务接受您为客户提供的凭据(例如用户名/密码,数字证书等),然后执行程序所需的S3 / SimpleDB操作。这样,AWS凭证永远不会离开AWS。如果特定用户的凭据遭到破坏,您可以在Web服务中取消这些凭据。