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

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

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

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

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

有任何想法吗?

更新:

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

更新2 – 2011年9月

亚马逊已经发布了一些有关使用AWS Security Token Service的详细信息,该服务允许在不泄露您的密钥的情况下进行身份validation。 此博客文章中提供了更多详细信息。

蒂姆,你确实打了两个关键的方法:

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

  2. 更好:将需要保护的内容推送到您的Web服务并在那里签名。 好消息是只需要签名请求名称和时间戳 – 而不是所有上传的位(我猜亚马逊不想花费周期来validation所有这些位!)。 以下是亚马逊自己的“ 针对C#开发人员的AWS简介 ”中的相关代码行。 注意如何仅使用“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 ); 

编辑:请注意,虽然您可以隐藏您的Amazon身份的密钥部分,但访问密钥ID部分需要嵌入到请求中。 除非您通过自己的网络服务发送文件,否则您必须将其嵌入应用程序中。

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

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

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

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

您可以加密配置文件和/或使用ProtectedData。 这是我的博客文章 。

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

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

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