Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Compositum
Member

Откуда: Санкт-Петербург
Сообщений: 5939
Доброго времени суток.

Имеется некоторое приложение TargetApp, в конфигурационных настройках которого хранится строка подключения к БД. Физически, настройки подключений к БД вынесены в отдельный файл connections.config. Т.о. общая картина следующая:

TargetApp.exe.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <connectionStrings configSource="connections.config"/>
</configuration>


connections.config:
<?xml version="1.0" encoding="utf-8" ?>
<connectionStrings>
  <clear/>
  <add name="crmdev" providerName="System.Data.SqlClient"
       connectionString="тут_некоторая_строка_подключения"/>
</connectionStrings>


Согласно документации Майкрософт, шифрование строк подключений, хранящихся в конфигурационном файле приложения, должно выполняться на той машине, где этот конфиг-файл будет использоваться. Т.е. шифровать конфиг на машине разработчика смысла нет.

Написал консольное приложение ConfigTools.exe, задача которого - шифровать/дешифровывать config-файлы того exe, имя которого было передано ему через параметры с одним из ключей: --encrypt, --decrypt.

При помощи ConfigTools.exe выполняю шифрование строк подключения в конфиг-файлах, используемых приложением TargetApp.exe.

Код шифровки/дешифровки достаточно простой:

static void EncryptConfig(string exeConfigName, bool encrypt)
{
	var resMng = new ResourceManager(typeof(Program));
	// Takes the executable file name without the
	// .config extension.

	// Open the configuration file and retrieve 
	// the connectionStrings section.
	var config = ConfigurationManager.
		OpenExeConfiguration(exeConfigName);

	var section = config.GetSection("connectionStrings")
		as ConnectionStringsSection;

	if (section == null)
	{
		Console.WriteLine(
			resMng.GetString("connectionStringsNotFound"));
		resMng.ReleaseAllResources();
		return;
	}

	if (encrypt && !section.SectionInformation.IsProtected)
	{
		// Encrypt the section.
		section.SectionInformation.ProtectSection(
			"DataProtectionConfigurationProvider");
		Console.WriteLine(resMng.GetString("connectionStringsEncrypted"));
		config.Save();
	}
	else if (!encrypt && section.SectionInformation.IsProtected)
	{
		// Remove encryption.
		section.SectionInformation.UnprotectSection();
		Console.WriteLine(resMng.GetString("connectionStringsDecrypted"));
		config.Save();
	}
	else
	{
		Console.WriteLine(resMng.GetString("connectionStringsDoNothing"));
	}
	resMng.ReleaseAllResources();
}


TargetApp.exe успешно извлекает из настроек строки подключения, не зависимо от того зашифрованы они или нет. Т.е. одно приложение шифрует/расшифровывает config-файл, но при этом оба приложения успешно считывают строки подключения (платформа .net framework сама автоматом всё расшифровывает при обращении к соответствующей записи, хранящей строку подключения).

Т.е. с одной стороны вроде всё нормально - открыв в Notepad мой config-фай, юзер увидит зашифрованную строку подключения... Но вот с другой стороны всё же возникает большой вопрос о надёжности такой защиты... Ведь получается, что любой желающий может написать подобный код, запустить его на целевой машине и с лёгкостью расшифровать строки подключения... Может я чего-то упускаю из вида?

Как защитить шифруемую информацию от подобных случаев?

С уважением, Андрей
27 май 19, 16:44    [21895018]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
Compositum,

если так рассуждать, то защиты вообще не существует и в целом, так и есть. Можно запустить отладчик на целевой машине и перехватить пароли в незашифрованном виде, рано или поздно они всё равно расшифруются.
данная операция (шифрование\дешифрование) секции конфигурационного файла требует права администратора с повышением, то есть, если пользователь захочет зашифровать или расшифровать файл на компьютере у него не получится.
если злоумышленник скопирует файл, то расшифровать он его уже не сможет.
Ну, а если злоумышленник обладает правами администратора на целевом компьютере, то его уже ничего не остановит, это картблашн на любые действия.
27 май 19, 16:55    [21895038]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Compositum,
Если ты админ то никак или слишком дорого.
Защита не дороже стоимости защищаемых данных (с)
Сколько твои стоят?
Или теория?
Ну и защита это комплексные мероприятия. А не строка Пароль.
27 май 19, 17:33    [21895080]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
Еще пароли можно хранить в Credential Manager'е ОС Windows, довольно удобно
27 май 19, 18:13    [21895103]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
BlackEric
Member

Откуда:
Сообщений: 741
Для работы с кредами есть такая штука:
https://www.vaultproject.io/

Шарповая либа к ней: https://github.com/rajanadar/VaultSharp
27 май 19, 18:54    [21895122]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
BlackEric
Для работы с кредами есть такая штука:
https://www.vaultproject.io/

Шарповая либа к ней: https://github.com/rajanadar/VaultSharp

очередной велосипед?
            [DllImport("Advapi32.dll", EntryPoint = "CredReadW", CharSet = CharSet.Unicode, SetLastError = true)]
            internal static extern bool CredRead(string target, CredentialType type, int reservedFlag, out IntPtr CredentialPtr);

            [DllImport("Advapi32.dll", EntryPoint = "CredWriteW", CharSet = CharSet.Unicode, SetLastError = true)]
            internal static extern bool CredWrite([In] ref CREDENTIAL userCredential, [In] uint flags);
27 май 19, 19:39    [21895147]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Compositum
Member

Откуда: Санкт-Петербург
Сообщений: 5939
Roman Mejtes
данная операция (шифрование\дешифрование) секции конфигурационного файла требует права администратора с повышением, то есть, если пользователь захочет зашифровать или расшифровать файл на компьютере у него не получится.

Увы... Проверил с правами рядового пользователя - всё успешно расшифровалось, к сожалению безо всяких админских прав.
Roman Mejtes
Сколько твои стоят?
Или теория?

Не теория. Стоят прилично. Данные не мои, а компании. Предлагаю флуд не разводить.
27 май 19, 21:02    [21895183]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Compositum
Предлагаю флуд не разводить.
это не флуд. Это в ВУЗЕ преподают.

Compositum
Проверил с правами рядового пользователя
пользователь Иванов расшифровал свой пароль или чужой?
27 май 19, 21:53    [21895196]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Compositum
Member

Откуда: Санкт-Петербург
Сообщений: 5939
На тот случай, если будет интересно проверить - во вложении архив, в котором инструкция и два подопытных кролика: консолька шифровки\расшифровки строки подключения в конфиг-файле, и другая консолька, над конфиг-файлом которой выполняются опыты (согласно инструкции, обозначенной в readme.txt).

К сожалению, шифровка\расшифровка без проблем выполняется из под обычного юзера. ☹

К сообщению приложен файл (example.zip - 11Kb) cкачать
27 май 19, 21:53    [21895197]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Compositum
если будет интересно
никому не интересно. В конфиге юзаеря не хранятсе все пароли.
27 май 19, 21:55    [21895198]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Compositum
Member

Откуда: Санкт-Петербург
Сообщений: 5939
Petro123
пользователь Иванов расшифровал свой пароль или чужой?

Оба варианта успешно отработали.
27 май 19, 21:59    [21895203]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Compositum
Petro123
пользователь Иванов расшифровал свой пароль или чужой?

Оба варианта успешно отработали.
откуда в конфиге чужие пароли?
27 май 19, 22:03    [21895204]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Compositum
Member

Откуда: Санкт-Петербург
Сообщений: 5939
Petro123
откуда в конфиге чужие пароли?

Не "чужие", а специальные учётные записи, от имени которых должны выполняться определённые операции на различных серверах.
27 май 19, 22:06    [21895208]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Compositum
Petro123
откуда в конфиге чужие пароли?

Не "чужие", а специальные учётные записи, от имени которых должны выполняться определённые операции на различных серверах.
тебе решать.
Нужна безопасность? Раздели конфиги. Не нужна? Не дели.
Ваш КЭП.
27 май 19, 22:09    [21895212]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Я что-то не пойму цель - спрятать пароль пользователя от самого этого пользователя? :))
27 май 19, 23:50    [21895267]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>Roman Mejtes, сегодня, 16:55 [21895038]
>...Ну, а если злоумышленник обладает правами администратора на целевом компьютере…
< Поместил файл в шифроконтейнер WinRAR и записал на целевой компьютер, злоумышленник обладает правами администратора на нем и ...
27 май 19, 23:57    [21895270]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>fkthat, сегодня, 23:50 [21895267]
>Я что-то не пойму цель - спрятать пароль пользователя от самого этого пользователя? :))
<Можно попытаться спрятать строку соединения и от самого пользователя
28 май 19, 00:01    [21895272]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ВМоисеев
>fkthat, сегодня, 23:50 [21895267]
>Я что-то не пойму цель - спрятать пароль пользователя от самого этого пользователя? :))
<Можно попытаться спрятать строку соединения и от самого пользователя


Зачем? Пользователь либо может коннектиться к БД со своего хоста, либо не может. И, если может, то никакими ухищрениями ты на 100% ему не запретишь делать это как угодно.
28 май 19, 00:15    [21895274]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
User расшифровывает LocalMachine секции конфигов? что то не верится
28 май 19, 00:40    [21895280]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>fkthat, сегодня, 00:15 [21895274]
>Зачем? Пользователь либо может коннектиться к БД со своего хоста, либо не может…
<Вообще говоря, коннектится приложение, пользователю строка соединения по барабану
28 май 19, 01:42    [21895290]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
ВМоисеев
Вообще говоря, коннектится приложение, пользователю строка соединения по барабану

Да, но оно коннектится с логином и паролем того пользователя, который его использует (потому что иначе это вообще какой-то треш), поэтому какой смысл там прятать что-то - прятать от пользователя его же собственные логин и пароль?
28 май 19, 02:06    [21895291]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
stenford
Member

Откуда: урал
Сообщений: 2749
для начала пароли в строке подключения вообще нельзя держать (к тому-же там скорее всего у тебя пароль админа лежит), должна использоваться виндовая аутентификация. Во-вторых, велосипеды по шифрованию конфигов писать не надо, они уже есть, например aspnet_regiis, все что нужно сделать - скопировать на пользовательские машины ключ, пользователький конкекст конечно-же должен иметь доступ к нему иначе как он его расшифрует
28 май 19, 02:06    [21895292]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Compositum
Не "чужие", а специальные учётные записи, от имени которых должны выполняться определённые операции на различных серверах.

Треш угар и содомия. Выходит, что к бесценным данным компании куча пользователей имеет доступ с использованием одного и того же логина и пароля. У тебя в консерватории защиты данных изначально не так, а твои ухишрения с шифрованием это как в том самом борделе кровати переставлять.
28 май 19, 02:24    [21895293]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
stenford,

В двузвенке (а речь, как я понял, идет именно о двузвенке), ни логин ни пароль не следует держать нигде, в принципе. У каждого пользователя должен быть свой персональный логин и пароль, который он должен помнить и вводить для коннекта к БД. Ну, или, как правильно сказали, и вообще следовало было бы сделать - виндовая аутентификация.
28 май 19, 02:30    [21895294]     Ответить | Цитировать Сообщить модератору
 Re: Как защитить зашифрованную в config-файле информацию от расшифровки извне?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
Roman Mejtes
данная операция (шифрование\дешифрование) секции конфигурационного файла требует права администратора с повышением, то есть, если пользователь захочет зашифровать или расшифровать файл на компьютере у него не получится

С чего бы это? DataProtectionConfigurationProvider - это DpapiProtectedConfigurationProvider, т.е. используется DPAPI, причем уровня хоста, а не приложения. Им может пользоваться кто угодно.

Compositum,
При использовании DataProtectionConfigurationProvider шифрование можно перенести с уровня хоста на уровень приложения - см. здесь: https://stackoverflow.com/questions/21336455/protect-config-file-with-user-level-dpapi-winforms
Но я всё же присоединяюсь к предыдущим ораторам. Неправильно это. Раз используется MSSQL, то вин-аутентификация, и права на сервере строго в рамках выполняемой задачи (а то некоторые админы как писать grant-скрипты не знают, тыкать галки на объектах в SSMS им долго, поэтому сделают на сервере логин, дадут ему sa - и можно пить чай, такого супергероя даже на соответствующих пользователей в базе мапить не нужно).
28 май 19, 06:35    [21895316]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить