Рекомендации по хранению учетных данных - PullRequest
4 голосов
/ 03 февраля 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 03 февраля 2009

Не могу взять кредит за ответ: Но вот пост в блоге под названием "Шифрование паролей в .NET App Config" с полным кодом.

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

2 голосов
/ 04 февраля 2009

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

Полный текст онлайн на http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook.HomePage

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

0 голосов
/ 11 января 2016

Параметр # 1 : зашифровать разделы в файле App.config для 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>

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

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

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