3

有类似的问题 How to Manage Key in a Symmetric Algorithm 在哪里存储要在 SHA-1 哈希中使用的密钥?

我的问题是一样的,但我想问不同的问题

我有 C# 应用程序。我正在加密应用程序中的一些数据。对于加密,我使用密钥或密码。解密也需要同样的东西。

在哪里/如何在应用程序中存储此密钥或密码?它很容易从反射中查看字符串密码。我可能会使用一些组合来生成密码,但一些聪明的人可以通过一些努力猜到。

是否有任何安全的方法来存储或管理应用程序中用于加密数据的秘密密码?

4

2 回答 2

7

我怀疑是否有任何安全的方式来存储密钥。最终,您的程序必须获得密钥的访问权,破解者可以通过逆向工程轻松计算出这是如何发生的,并将该字符串重定向到他们想要的任何地方。

您最好的选择是:

  • 尽可能混淆密钥。这使得访问“密钥”变得更加困难,但并不意味着不可能(见上文)。与其将其存储为字符串,不如使用函数生成它,或者使用种子并将其传递给函数以获取秘密字符串。

  • 如果您的用例允许,请使用公钥/私钥对。只有当您希望您的应用程序加密数据、将其发送到您的服务器,然后您想对其进行解密时,它才有效。在这种情况下,您将公钥嵌入到应用程序中(不管破解者是否发现),并将私钥保存给您自己或您的服务器。

于 2012-11-27T07:36:17.563 回答
0

如果您将密钥存储为应用程序设置,并加密应用程序设置,那么我认为您非常省钱。

您可以使用以下代码来加密 app.config 的各个部分。

using System;
using System.Configuration;

public static class ConfigurationEncryptor {
    [Flags]
    public enum ConfigurationSectionType {
        ConnectionStrings = 1,
        ApplicationSettings = 2
    }

    /// <summary>
    /// Encrypts the given sections in the current configuration.
    /// </summary>
    /// <returns>True is the configuration file was encrypted</returns>
    public static bool Encrypt(ConfigurationSectionType section) {
        bool result = false;

        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        if (config == null)
            throw new Exception("Cannot open the configuration file.");

        if (section.HasFlag(ConfigurationSectionType.ConnectionStrings)) {
            result = result || EncryptSection(config, "connectionStrings");
        }

        if (section.HasFlag(ConfigurationSectionType.ApplicationSettings)) {
            result = result || EncryptSection(config, "appSettings");
        }

        return result;
    }

    /// <summary>
    /// Encrypts the specified section.
    /// </summary>
    /// <param name="config">The config.</param>
    /// <param name="section">The section.</param>
    private static bool EncryptSection(Configuration config, string section) {
        ConfigurationSection currentSection = config.GetSection(section);
        if (currentSection == null)
            throw new Exception("Cannot find " + section + " section in configuration file.");
        if (!currentSection.SectionInformation.IsProtected) {
            currentSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
            config.Save();

            // Refresh configuration
            ConfigurationManager.RefreshSection(section);

            return true;
        }
        return false;
    }
}

并像这样使用它(例如在您的 Main() 方法中):

ConfigurationEncryptor.Encrypt(
    ConfigurationEncryptor.ConfigurationSectionType.ApplicationSettings |
    ConfigurationEncryptor.ConfigurationSectionType.ConnectionStrings
);
于 2012-11-27T07:36:36.250 回答