代码之家  ›  专栏  ›  技术社区  ›  Tim

将我的亚马逊凭证存储在C桌面应用程序中

  •  14
  • Tim  · 技术社区  · 15 年前

    我正在研究在桌面应用程序中使用AmazonS3和SimpleDB。

    我的主要问题是,我要么需要在应用程序中存储我的AWS凭证,要么使用其他方案。

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

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

    有什么想法吗?

    更新:

    我需要更清楚一点,我想把我的AWS凭证存储在发给其他人的应用程序中。DPAPI或任何其他加密都只能阻止人们使用Reflector获取凭证。使用任何加密仍然需要容易获得的密钥。

    更新日期:2011年9月2日

    亚马逊已经发布了一些关于使用AWS安全令牌服务的细节,该服务允许在不泄露您的秘密密钥的情况下进行身份验证。有关更多详细信息,请访问 this blog post .

    4 回复  |  直到 13 年前
        1
  •  10
  •   Oren Trutner    15 年前

    蒂姆,你确实找到了两个关键方法:

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

    2. 更好:将需要保护的内容推送到您的Web服务并在那里签名。好消息是,只需要对请求名和时间戳进行签名——而不是对所有上传的位进行签名(我想Amazon也不想在验证所有这些位上花费周期!)以下是亚马逊自己的相关代码行。” Introduction to AWS for C# Developers “。注意如何 Aws_GetSignature 只使用“putObject”和时间戳调用?您完全可以在自己的Web服务上实现签名,而不必发送整个文件,也不必牺牲密钥。如果你想知道, 自动签名 是一个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部分需要嵌入到请求中。除非您通过自己的Web服务发送文件,否则您必须将其嵌入到应用程序中。

        2
  •  0
  •   Alex Reynolds    15 年前

    我的主要问题是,我要么需要在应用程序中存储我的AWS凭证,要么使用其他方案。

    Windows有类似苹果的全系统服务吗 Keychain Manager 是吗?如果是,把你的证件放在那里。如果没有,也许您可以构建一个精简版本的它来存储您的AWS凭证的强加密版本。

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

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

        3
  •  0
  •   Jon Galloway    15 年前

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

    更新:作为安装步骤的一部分,您可能需要加密app.config。样品如下: http://www.codeproject.com/KB/security/encryptstrings.aspx . 不是很好,但我找到了迄今为止最好的。

        4
  •  0
  •   Eric J.    15 年前

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

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