我有一些代码需要使用提升的权限运行(更多我希望我的代码运行的其余部分)。
我的代码设置了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上运行。
答案 0 :(得分:6)
你能使用CryptoAPI吗?请参阅接受的答案:
答案 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)
这里有多个选项。
您可以第一次散列密码并将散列存储到文件中。现在,下一次,您希望使用提升的权限执行代码,您需要接受/重新键入密码并重新计算哈希值并将其与存储的哈希值匹配。只有匹配时才会在高程模式下执行代码。您可以使用SHA进行哈希。有关散列的示例,请查看System.Crytography命名空间。
第二个选项是使用AES等算法加密密码。但是,您需要有一把钥匙才能执行此操作,您将不得不担心要保护此密钥。
第三个选项是使用DPAPI并加密密码,但不担心保护密钥 - 比2更容易。
如果您不介意每次应用程序启动时重新输入密码,我建议使用1。如果这不可能,我建议使用3并使用DPAPI。
以下是一些帮助您入门的链接。
1。http://www.obviex.com/samples/dpapi.aspx 2. http://www.obviex.com/samples/Encryption.aspx
答案 3 :(得分:2)
您没有指定这是桌面应用程序还是Web应用程序......
答案 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");