Рекомендации по хранению учетных данных

Я пишу службу Windows, и мне нужно делать аутентифицированные веб-запросы. Служба не будет работать под управлением учетных данных, используемых для выполнения запроса; это означает, что мне нужно каким-то образом сохранить учетные данные для запроса.

Каковы лучшие практики здесь? Учетные данные нужно будет хранить в App.config (или аналоге); Я бы не хотел, чтобы пароль болтался в виде простого текста. Поскольку пароли часто меняются, создание или иное запекание пароля в двоичном файле не является вариантом.

Тот же вопрос относится и к Powershell. Мне нужно делать аутентифицированные запросы, но я не хочу, чтобы сценарий содержал в текстовой форме учетные данные, используемые для запросов.


person Ry Jones    schedule 03.02.2009    source источник


Ответы (3)


Не могу взять на себя ответственность за ответ: но вот сообщение в блоге под названием «Шифрование паролей в конфигурации приложения .NET» с включенным полным кодом.

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

person Timur Fanshteyn    schedule 03.02.2009

Я всегда обращаюсь к книге Кейта Брауна «Руководство разработчика .NET по безопасности Windows» для подобных вещей.

Полный текст находится в Интернете по адресу http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook.HomePage

Конкретный раздел, который вам нужен (о хранении секретов), находится по адресу http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/HowToStoreSecretsOnAMachine.html

person Antony Perkov    schedule 04.02.2009
comment
Прошло 10 лет, но... ссылки не работают - person Hoppe; 22.03.2019

Вариант 1. Зашифруйте разделы в файле App.config for Web.config с помощью метода ProtectSection(). Это предназначено для работы с веб-приложениями и приложениями для настольных ПК, а также с веб-фермами, которые полагаются на репликацию файлов Web.config с зашифрованными разделами.

Подробные руководства MSDN, посвященные использованию поставщика RSA:

Пример:

static public void ProtectSection()
{

    // Get the current configuration file.
    System.Configuration.Configuration config =
            ConfigurationManager.OpenExeConfiguration(
            ConfigurationUserLevel.None);


    // Get the section.
    UrlsSection section =
        (UrlsSection)config.GetSection("MyUrls");


    // Protect (encrypt)the section.
    section.SectionInformation.ProtectSection(
        "RsaProtectedConfigurationProvider");

    // Save the encrypted section.
    section.SectionInformation.ForceSave = true;

    config.Save(ConfigurationSaveMode.Full);

    // Display decrypted configuration 
    // section. Note, the system
    // uses the Rsa provider to decrypt
    // the section transparently.
    string sectionXml =
        section.SectionInformation.GetRawXml();

    Console.WriteLine("Decrypted section:");
    Console.WriteLine(sectionXml);

}

Старый подход с использованием провайдера DPAPI:

Чтобы зашифровать:

aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider"

Для расшифровки:

aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"

Незашифрованный раздел:

<configuration>
  <connectionStrings>
    <add name="SampleSqlServer" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
   </connectionStrings>
</configuration>

Зашифрованный раздел:

<configuration>
  <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>RSA Key</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>RXO/zmmy3sR0iOJoF4ooxkFxwelVYpT0riwP2mYpR3FU+r6BPfvsqb384pohivkyNY7Dm4lPgR2bE9F7k6TblLVJFvnQu7p7d/yjnhzgHwWKMqb0M0t0Y8DOwogkDDXFxs1UxIhtknc+2a7UGtGh6Di3N572qxdfmGfQc7ZbwNE=
            </CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>KMNKBuV9nOid8pUvdNLY5I8R7BaEGncjkwYgshW8ClKjrXSM7zeIRmAy/cTaniu8Rfk92KVkEK83+UlQd+GQ6pycO3eM8DTM5kCyLcEiJa5XUAQv4KITBNBN6fBXsWrGuEyUDWZYm6Eijl8DqRDb11i+StkBLlHPyyhbnCAsXdz5CaqVuG0obEy2xmnGQ6G3Mzr74j4ifxnyvRq7levA2sBR4lhE5M80Cd5yKEJktcPWZYM99TmyO3KYjtmRW/Ws/XO3z9z1b1KohE5Ok/YX1YV0+Uk4/yuZo0Bjk+rErG505YMfRVtxSJ4ee418ZMfp4vOaqzKrSkHPie3zIR7SuVUeYPFZbcV65BKCUlT4EtPLgi8CHu8bMBQkdWxOnQEIBeY+TerAee/SiBCrA8M/n9bpLlRJkUb+URiGLoaj+XHym//fmCclAcveKlba6vKrcbqhEjsnY2F522yaTHcc1+wXUWqif7rSIPhc0+MT1hB1SZjd8dmPgtZUyzcL51DoChy+hZ4vLzE=
        </CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>
</configuration>

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

Вариант 2. Зашифруйте строки в файле конфигурации и используйте SecureString() для временного хранения расшифрованных строк. Это может или не может дать вам много возможностей для атаки в зависимости от того, используете ли вы API-интерфейсы для строк поддержка SecureString.

person Tony O'Hagan    schedule 11.01.2016