Как мне зашифровать строку подключения в app.config? - PullRequest
2 голосов
/ 05 марта 2011

Каким способом лучше всего зашифровать connstring в app.config?

  1. используйте cryptography для шифрования и дешифрования или
  2. используйте %windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" "C:\documents and settings\bob\projects\myproject", как рекомендуется в Защитить файл App.Config или Encrypt .

проблемы:
1) Если я использую Crytography, все работает нормально. За исключением того, что этот код ниже будет вызываться каждый раз, когда вы сталкиваетесь с using (leDataContext db = new leDataContext()), что заставляет меня чувствовать, что это замедлит работу системы.

public partial class leDataContext
{
    public leDataContext()
        : base("")
       // : base(ConfigurationManager.ConnectionStrings["leConnString"].ToString())
    {           
        string decrypted = Cryptography.Decrypt(ConfigurationManager.ConnectionStrings["leConnString"].ToString());
        base.Connection.ConnectionString = decrypted;
    }
}

2) Если я использую метод 2, он звучит хорошо, так как автоматически выполняет шифрование. Однако следует ли мне хранить эти зашифрованные <CipherValue>rUmEA8h02uMZ5M4uEVtL+5M/UvPuyJ4UJz5d/P...</CipherValue> в моем app.conf при публикации с использованием ClickOnce?

Это потому, что метод 2 может быть выполнен только на клиентском компьютере. Поэтому я должен выполнить метод 2 на клиентском компьютере, затем скопировать этот зашифрованный код в файл, и каждый раз, когда я хочу опубликовать, используя clickOnce, а затем скопировать его вручную обратно в файл App.config перед публикацией, чтобы клиент обновил права connstring

Криптографический код:

  internal static string Encrypt(string sender, string key)
    {
        string text1;
        if (sender == null) sender = "";

        byte[] buffer4 = new byte[0];
        byte[] buffer1 = buffer4;
        byte[] buffer2 = new byte[] { 110, 120, 130, 140, 150, 160, 170, 180 };

        try
        {
            buffer1 = Encoding.UTF8.GetBytes(key.Substring(0, 8));
            DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider();
            byte[] buffer3 = Encoding.UTF8.GetBytes(sender);
            MemoryStream stream1 = new MemoryStream();
            CryptoStream stream2 = new CryptoStream(stream1, provider1.CreateEncryptor(buffer1, buffer2), CryptoStreamMode.Write);
            stream2.Write(buffer3, 0, buffer3.Length);
            stream2.FlushFinalBlock();
            text1 = Convert.ToBase64String(stream1.ToArray());
        }
        catch (Exception ex)
        {
            text1 = string.Empty;
        }
        return text1;
    }

Не могли бы вы посоветовать?

1 Ответ

3 голосов
/ 05 марта 2011

Если вы беспокоитесь о том, что код дешифрования вызывается все время, вы можете сохранить его (либо в HttpContext.Items / Cache, если вас беспокоит несколько вызовов на одной странице, либо в статическом, если вы 'беспокоюсь об этом по всем запросам).

Если вы собираетесь поместить его в статическое состояние (примечание: это означает, что расшифрованное значение хранится в памяти, что может быть проблемой, в зависимости от того, почему именно вышифрование), я бы порекомендовал использовать статический конструктор для его расшифровки, чтобы гарантировать, что код выполняется только один раз и не может иметь никаких одновременных проблем:

public partial class leDataContext
{
    private static DecryptedConnectionString;
    static leDataContext()
    {
        // This code is guaranteed to run only once, by the framework, before any calls to the instance constructor below.
        DecryptedConnectionString = Cryptography.Decrypt(ConfigurationManager.ConnectionStrings["leConnString"].ToString());
    }

    public leDataContext()
        : base("")
    {           
        base.Connection.ConnectionString = DecryptedConnectionString;
    }
}

Есть также некоторые встроенные средства дляшифрование строк подключения, которые могут быть лучшим выбором:

Шифрование разделов файла конфигурации с использованием защищенной конфигурации

ASP.NET 2.0 предоставляет новую функцию, называемую защищенной конфигурацией, которая позволяет шифроватьконфиденциальная информация в файле конфигурации.Хотя защищенная конфигурация в основном предназначена для ASP.NET, она также может использоваться для шифрования разделов файла конфигурации в приложениях Windows.Подробное описание новых возможностей защищенной конфигурации см. В Шифрование информации о конфигурации с использованием защищенной конфигурации .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...