Шифрование строки подключения в памяти с использованием класса - PullRequest
1 голос
/ 04 июля 2019

Я пишу 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 является байтовым массивом, который является ссылочным типом? Честно говоря, я немного почесал голову от этого.

Пожалуйста, обратите внимание Я посмотрел на множество примеров, которые делают простое консольное приложение и выполняют шифрование и незашифрование одним и тем же способом - но можно ли это сделать так, как я пытаюсь сделать

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