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

Tim*_*Tim 14 .net c# amazon-s3 amazon-web-services

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

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

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

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

有任何想法吗?

更新:

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

更新2 - 2011年9月

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

Ore*_*ner 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 );
    
    Run Code Online (Sandbox Code Playgroud)

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