15

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

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

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

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

有任何想法吗?

更新:

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

更新 2 - 2011 年 9 月

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

4

4 回答 4

10

蒂姆,您确实在使用两种关键方法:

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

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

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

于 2009-07-21T21:25:31.063 回答
0

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

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

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

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

于 2009-07-21T19:10:22.460 回答
0

您可以加密配置文件和/或使用 ProtectedData。这是我关于两者的博文

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

于 2009-07-21T19:26:46.047 回答
0

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

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

于 2009-07-29T22:36:06.513 回答