2009-07-31 118 views
8

我有一些代码需要使用提升的权限运行(我希望我的代码的其余部分运行在更多位置)。在代码中输入密码的方法

我有我的代码,设置模拟工作,但它需要一个用户名,域和密码。由于我的代码在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

+0

感谢您的所有伟大的答案!我会尝试一下,选择一个最好的。再次感谢! – Vaccano 2009-08-01 17:37:28

回答

4

Vaccano,

我会建议调查你正在试图达到什么样的数据保护API(DPAPI)。在可逆地存储应用程序所需的密码的许多最佳实践方法中,它被认为是解决方案的一部分。

良好文章讨论DPAPI(和其它技术+问题)可以在这里找到:

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

随着C#2.0,P /调用甚至不要求;托管的包装存在:

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

我希望这有助于!

+1

Jon Galloway有一些实现这个的例子... http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx – MyItchyChin 2009-07-31 20:15:39

4

您在这里有多种选择。

  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

2

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