2009-07-31 120 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");