Способы ввода пароля в коде - PullRequest
8 голосов
/ 01 августа 2009

У меня есть немного кода, который должен работать с повышенными привилегиями (больше, чем я хочу, чтобы остальная часть моего кода работала).

У меня есть код, который настраивает олицетворение, но требует имя пользователя, домен и пароль. Поскольку мой код находится в C # .net, я знаю, что пароль может быть найден любым, кто достаточно определен.

Есть ли способ зашифровать пароль в моем коде? Или, в противном случае, защитите этот пароль и все равно сможете его передать?

Вот код, по которому я звоню:

using (new Impersonator("UserNameGoesHere", "DomainNameGoesGere", "Password Goes Here"))
{
     uint output;
     NetUserAdd(AUTHENTICATION_SERVER, 1, ref userinfo, out output);
     return output;
}

Мне бы очень понравился пример, показывающий, как это исправить, чтобы мой пароль не отображался в виде обычного текста.

Я использую Visual Studio 2008, .NET 3.5 с пакетом обновления 1 (SP1) и работаю в Windows Server 2003.

Ответы [ 5 ]

6 голосов
/ 01 августа 2009

Можете ли вы использовать CryptoAPIs? Смотрите принятый ответ:

Как хранить пароли в приложении Winforms?

4 голосов
/ 01 августа 2009

У вас есть несколько вариантов здесь.

  1. Вы можете хешировать пароль в первый раз и сохранить хеш в файл. Теперь, когда в следующий раз вы захотите выполнить код с повышенными привилегиями, вам нужно принять / повторно ввести пароль, пересчитать хеш и сопоставить его с сохраненным хешем. Только если он соответствует, вы будете выполнять свой код в режимах повышения прав. Вы можете хэшировать с помощью SHA. Пожалуйста, посмотрите на пространство имен System.Crytography для примеров хэширования.

  2. Второй вариант - зашифровать пароль с помощью таких алгоритмов, как AES. Однако для этого вам понадобится ключ, и вам придется беспокоиться о его сохранности.

  3. Третий вариант - использовать DPAPI и шифровать пароль, но не беспокоиться о защите ключей - гораздо более простой вариант, чем 2.

Я бы порекомендовал 1, если вы не против повторного ввода пароля при каждом запуске приложения. Если это невозможно, я бы предложил использовать 3 и использовать DPAPI.

Вот несколько ссылок, с которых можно начать.

1. http://www.obviex.com/samples/dpapi.aspx 2. http://www.obviex.com/samples/Encryption.aspx

4 голосов
/ 01 августа 2009

Vaccano,

Я бы порекомендовал изучить API защиты данных (DPAPI) для того, чего вы пытаетесь достичь. Это считается частью решения во многих подходах наилучшей практики для обратимого хранения паролей, необходимых приложениям.

Хорошую статью, в которой обсуждается DPAPI (и другие методы + проблемы), можно найти здесь:

http://msdn.microsoft.com/en-us/magazine/cc164054.aspx

В C # 2.0 P / Invoking даже не требуется; существуют управляемые оболочки:

http://blogs.freshlogicstudios.com/Posts/View.aspx?Id=41ca5a99-ddc0-4d0a-9919-2ce10bf50c7e

Надеюсь, это поможет!

2 голосов
/ 01 августа 2009

Вы не указали, было ли это настольное или веб-приложение, так что ...

ASP.NET 2.0 поддерживает шифрование разделов web.config.

1 голос
/ 18 ноября 2015

Вы можете использовать safe-config пакет nuget. Внутренне он использует API защиты данных для шифрования и дешифрования данных.

//Save some configuration data at folder data\temp\
var configManager = new ConfigManager()
    .WithOptions(DataProtectionScope.CurrentUser)
    .Set("password", "my-massword")
    .AtFolder(@"data\temp\")
    .Save();

    ...

//Load configuration data
var loadedValue = new ConfigManager()
    .AtFolder(@"data\temp\")
    .Load()
    .Get<string>("password");
...