использование securestring для соединения sql

Я хочу использовать SecureString для хранения строки подключения к базе данных. Но как только я установлю для свойства ConnectionString объекта SqlConnection значение securestring, наверняка оно станет видимым для любого другого приложения, которое может читать память моего приложения?

Я сделал следующие предположения:
а) я не могу создать экземпляр объекта SqlConnection за пределами управляемой памяти
б) любая строка в управляемой памяти может быть прочитана таким приложением, как Hawkeye


person Rich    schedule 17.12.2009    source источник
comment
Судя по всему, Hawkeye 1.2.0 умеет показывать SecureString... Итак, какой у вас вопрос?   -  person DK.    schedule 17.12.2009
comment
О, так какой тогда смысл в безопасных строках?   -  person Rich    schedule 17.12.2009
comment
Свойство Persist Security Info строки подключения может вас заинтересовать.   -  person Sql Surfer    schedule 18.04.2018


Ответы (5)


Вы абсолютно правы, SecureString не дает вам никаких преимуществ, когда вам нужно передать строку в управляемый API, например, установить ConnectionString.

Он действительно предназначен для безопасной связи с безопасными неуправляемыми API.

Теоретически Microsoft могла бы рассмотреть возможность улучшения объекта SqlConnection для поддержки безопасного ConnectionString, но я думаю, что они вряд ли сделают это, потому что:

  • SecureString действительно полезен только в клиентском приложении, где, например. пароль создается посимвольно из пользовательского ввода, никогда не имея полного пароля в управляемой строке.

  • В такой среде чаще всего используется проверка подлинности Windows для подключений к SQL Server.

  • На сервере существуют и другие способы защиты учетных данных SQL Server, начиная с ограничения доступа к серверу для авторизованных администраторов.


2012

Microsoft улучшила SqlConnection для поддержки безопасного ConnectionString путем передачи SqlCredential в новый SqlConnection.Credential свойство:

SecureString pwd = AzureVault.GetSecretStringSecure("ProcessPassword");
SqlCredential = new SqlCredential("Richard", pwd)
connection.Credential = cred;

К сожалению, нет другого DbConnection (например, OdbcConnection, OleDbConnection, OracleConnection, EntityConnection, DB2Connection).

person Joe    schedule 17.12.2009
comment
.NET 4.5 позволяет передавать пароль в виде SecureString при использовании проверки подлинности SQL Server: Что нового в ADO.NET 4.5 - person Lee Grissom; 19.11.2011
comment
Я считаю, что SecureString предназначен для всех типов передачи секретов безопасным способом и не ограничивается неуправляемыми API. Per Lee SecureString поддерживаются .NET 4.5. Я лично работаю в инженерных средах поддержки предприятий, где служба поддержки самого низкого уровня может иметь доступ к некоторым данным в SQL, но не знает, что такое пароль пользователя SQL. Вместо этого этот секрет заранее шифруется с помощью сертификата, и программа получает право на использование сертификата, но не пользователя. - person David Burg; 01.04.2015
comment
@DavidBurg - я не понимаю твоей точки зрения. SqlConnection.ConnectionString по-прежнему не использует SecureString в .NET 4.5. Если вы можете избежать необходимости ввода пароля, то, очевидно, это лучшее решение, но это не всегда так. А программа, использующая сертификат для аутентификации, не нуждается в SecureString. - person Joe; 01.04.2015
comment
@Joe - Дело в том, что вам больше не нужен SqlConnection.ConnectionString, содержащий учетные данные пользователя с паролем, вместо этого вы используете объект SqlCredential для передачи учетных данных, в которых используется пароль, но как SecureString. Да, сертификат — это совершенно другой подход. SqlCredential — это меньшее изменение, так как вы можете продолжать использовать пароль. - person David Burg; 03.04.2015

Да, вы можете, и да, вы должны использовать SecureString, чтобы пароль не задерживался в памяти и не открывался для атак. Вместо использования строки подключения sql вам необходимо использовать новый класс SqlCredential, свойство Password которого является SecureString. Пожалуйста, обратитесь за помощью к приведенным ниже статьям.

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcredential.password(v=vs.110).aspx

http://www.codeproject.com/Tips/408901/Storing-your-connection-string-password-in-SecureS

person David Burg    schedule 01.04.2015

Почему строка подключения является проблемой? Разве пароль не будет тем, что вы хотите защитить (если только вы не указываете пароль в строке подключения, что является необязательным для всех драйверов, которые я видел). При этом пароль обычно должен быть «открытым» в памяти в какой-то момент (если только у драйвера нет API, который позволяет зашифровывать пароли или что-то в этом роде, но это, вероятно, в любом случае не сильно поможет).

Обычно это не проблема, потому что процесс находится в безопасной среде, например на веб-сервере, или работает под учетной записью системного администратора (поэтому обычные пользователи не могут получить доступ к памяти процесса), или, как правило, и то, и другое. Если это на клиентской машине, работающей в пользовательской среде, вы должны предположить, что процесс в любом случае скомпрометирован, и это не поможет. Как только вы защитите процесс, вам не придется беспокоиться о таких вещах.

person Mike Nelson    schedule 17.12.2009
comment
Конечные пользователи — не единственная угроза. Сторонние API также могут стать одним из них. Я согласен, однако, что если вы пишете приложение и знаете/доверяете каждой из его зависимостей, то, вероятно, это не так уж и важно. Но в некоторых компаниях такой роскоши нет. - person Crono; 27.01.2020

Присвоение значения SecureString SQLConnection.ConnectionString приведет к обходу защиты, что сделает его бесполезным.

SecureString предназначен для исправления этих обычных проблем со строками, ref:

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

ИМХО, тип SecureString - это патч для некачественной реализации безопасности, и в настоящее время SecureString не реализован во всей структуре, поэтому его преимущества нельзя использовать в полной мере.

У меня та же проблема, я выбираю шифрование RSA для хранения конфиденциальной информации в памяти.

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

person invert    schedule 07.04.2010
comment
В новой версии .NET реализация SecureString стала более целостной, что делает первоначальный ответ немного устаревшим. - person David Burg; 01.04.2015

Если вы беспокоитесь о безопасности, я предлагаю вам включить SSL на сервере SQL и общаться с ним с помощью SSL.

person Shamika    schedule 17.12.2009
comment
Однако не должен ли пароль подключения все еще быть в памяти в какой-то момент? - person ; 17.12.2009
comment
@JonB @Shamika да, я тоже думаю - person Rich; 17.12.2009
comment
Я не понимаю, какое отношение использование SSL имеет к этому вопросу. - person Joe; 17.12.2009
comment
Это немного ортогонально исходному вопросу. - person David Burg; 01.04.2015