Я пишу Windows Service с использованием C # и .Net 4.6. Служба настроена таким образом, что она постоянно работает, спя в течение настраиваемого периода времени, прежде чем запускать и выполнять некоторые задачи. Как часть начального запуска, служба запускает и получает список строк подключения, чтобы она могла подключиться к списку серверов баз данных и собрать некоторую информацию. Я хочу иметь возможность сохранять строки подключения в памяти. Идея состоит в том, что служба при запуске захватывает строки подключения и удерживает их в памяти, пока служба не остановится. В следующий раз, когда он начинается, он уходит и снова хватает их. Это привело меня к пути шифрования строк подключения, поскольку некоторые из них могут содержать комбинации имени пользователя и пароля.
Итак, что я пытался сделать, это создать класс для хранения этой информации и обрабатывать шифрование / дешифрование строки подключения на лету с помощью свойств get и set.
Примечание. Я жестко запрограммировал длину байтового массива в 1024, но, вероятно, его следует динамически скорректировать до ближайшего 16.
using System;
using System.Text;
using System.Security.Cryptography;
namespace XXXXXXX.DB
{
public class Instance
{
private byte[] _connectionString = new byte[1024];
System.Text.ASCIIEncoding ae = new ASCIIEncoding();
public string Name { get; set; }
public string ConnectionString
{
set
{
if (value.Length < _connectionString.Length)
value = value.PadRight(_connectionString.Length, ' ');
else
value = value.Substring(0, _connectionString.Length);
_connectionString = ae.GetBytes(value);
ProtectedMemory.Protect(_connectionString, MemoryProtectionScope.SameProcess);
}
get
{
ProtectedMemory.Unprotect(_connectionString, MemoryProtectionScope.SameProcess);
return ae.GetString(_connectionString).Trim();
}
}
}
Итак, я установил свойство ConnectionString для объекта Instance, и оно зашифровано, как я и ожидал. Но когда я получаю доступ к незашифрованной ConnectionString, результат все еще зашифрован:
using (SqlConnection connection = new SqlConnection(_theInstance.ConnectionString))
Я думаю, это тот факт, что закрытая переменная-член для ConnectionString является байтовым массивом, который является ссылочным типом? Честно говоря, я немного почесал голову от этого.
Пожалуйста, обратите внимание Я посмотрел на множество примеров, которые делают простое консольное приложение и выполняют шифрование и незашифрование одним и тем же способом - но можно ли это сделать так, как я пытаюсь сделать