【问题标题】:Ideal method of storing sensitive hardcoded values存储敏感硬编码值的理想方法
【发布时间】:2013-01-14 00:05:19
【问题描述】:

我的应用程序需要使用特定的消费者密钥和固定值的消费者秘密发布到 Twitter。

我无法确定在我的应用程序中安全存储这些值的最佳方式(用户不应该能够使用另一个 Twitter 应用程序 - 只有我的应用程序)。

以下是我已经尝试过的一些事情:

场景 1:在 App.Settings 中存储

失败 - App.Settings 最初未加密。

场景 2:存储为硬编码值并使用 Dotfuscator

失败 - 变量经过混淆处理后在 Reflector 中清晰可见。

场景 3:加密并存储为硬编码值。

失败 - 虽然这通过了场景 1,但密钥本身将被硬编码(以确保它生成正确的解密值)并且对于场景 2 可见。

我遇到的主要问题是,为了让 Twitter 识别我的消费者密钥/秘密,它们需要被解密,但是我不希望在应用程序本身中明确设置此值。

解决这个问题的最佳方法是什么?

【问题讨论】:

  • 请参阅[如何保护 OAuth 密钥免受用户反编译我的项目?][1]。略有不同的问题,相同的解决方案(真的没有)。 [1]:stackoverflow.com/questions/7623335/…
  • @Jobo 你能把这个作为答案发布吗?我有一种感觉,实际上我无能为力,而且您的链接问题似乎是正确的。

标签: c# wpf oauth


【解决方案1】:

正如 Stephen C. 在回答 How do I protect OAuth keys from a user decompiling my project? 时提到的那样,您无能为力。

我最好的选择是让它尽可能地难,但要注意它从来都不是真正安全的事实。

【讨论】:

    【解决方案2】:

    App.Settings 最初未加密

    您可以使用ProtectedData类对此类数据进行加密/解密,并将加密值存储在.settings中:

        public static String Encrypt(this String unSecuredString)
        {
            if (String.IsNullOrEmpty(unSecuredString))
                return unSecuredString;
    
            var decryptedData = Encoding.UTF8.GetBytes(unSecuredString);
            var encryptedData = ProtectedData.Protect(decryptedData, null, DataProtectionScope.CurrentUser);
    
            return Convert.ToBase64String(encryptedData);
        }
    
        public static String Decrypt(this String securedString)
        {
            if (String.IsNullOrEmpty(securedString))
                return securedString;
    
            var encryptedData = Convert.FromBase64String(securedString);
            var decryptedData = ProtectedData.Unprotect(encryptedData, null, DataProtectionScope.CurrentUser);
    
            return Encoding.UTF8.GetString(decryptedData);
        }
    

    【讨论】:

    • 这个问题是必须首先将不安全的字符串传递给这个函数。
    • @JamieKeeling:你是对的,但这取决于你从哪里收到这个不安全的字符串。例如,如果您从网络服务器收到它,或者用户输入它,这不是问题。
    • 这些值由我提供(因为我已经创建了一个 Twitter 应用程序来处理发布消息),因此不会发生用户输入。此外,如果我从网络服务器接收它,那么它必须是未加密的(并且可以通过提琴手检测到),因为我无法在我的应用程序中解密它。
    • @JamieKeeling: > 并且可以通过 fiddler 检测到 - 此外,如果您要解密某些内容,可以通过进程内存转储轻松获得。所以,最好的保护是根本不解密任何东西。它适合你吗? :)
    • 我正在使用 SecureString 来尝试降低风险msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2013-04-01
    • 2014-05-25
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多