在代码中输入密码的方法

时间:2009-07-31 20:02:28

标签: c# visual-studio-2008 security

我有一些代码需要使用提升的权限运行(更多我希望我的代码运行的其余部分)。

我的代码设置了Impersonation,但它需要用户名,域名和密码。由于我的代码在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 SP1,并在Windows Server 2003上运行。

5 个答案:

答案 0 :(得分:6)

你能使用CryptoAPI吗?请参阅接受的答案:

How to store passwords in Winforms application?

答案 1 :(得分:4)

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 :(得分:4)

这里有多个选项。

  1. 您可以第一次散列密码并将散列存储到文件中。现在,下一次,您希望使用提升的权限执行代码,您需要接受/重新键入密码并重新计算哈希值并将其与存储的哈希值匹配。只有匹配时才会在高程模式下执行代码。您可以使用SHA进行哈希。有关散列的示例,请查看System.Crytography命名空间。

  2. 第二个选项是使用AES等算法加密密码。但是,您需要有一把钥匙才能执行此操作,您将不得不担心要保护此密钥。

  3. 第三个选项是使用DPAPI并加密密码,但不担心保护密钥 - 比2更容易。

  4. 如果您不介意每次应用程序启动时重新输入密码,我建议使用1。如果这不可能,我建议使用3并使用DPAPI。

    以下是一些帮助您入门的链接。

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

答案 3 :(得分:2)

您没有指定这是桌面应用程序还是Web应用程序......

ASP.NET 2.0 supports encrypting sections of the web.config.

答案 4 :(得分:1)

您可以使用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");