2013-11-14 105 views
3

我需要一個變量,其訪問將具有不同形式的應用程序。安全數據的全局變量

在這個變量我想存儲一個密碼。我想知道如何最好地定義這個變量?通過代表?

CSP? (但是對於非對稱密鑰的CSP,對不對?)一些孤立的存儲?或在Program.cs的例子靜態類只是方法:

static class Data 
{ 
    public static string Value { get; set; } 
} 

我問這個是因爲我想保護自己免受特洛伊木馬可以訪問我的過程中,你知道像ArtMoney :)

+1

['SecureString'](http://msdn.microsoft.com/en-us/library/system.security.securestring(v = vs.110).aspx) –

回答

5

我確定你已經知道這一點,但我會重申它只是爲了確保:你不能保護你的應用程序免受在同一臺機器上運行的木馬程序。你可以讓它變得更難。

也就是說,SecureString類確保密碼只在(未加密的)內存中儘可能短,從而使其他進程難以提取該信息。

注意閱讀存儲在SecureString的價值是不那麼容易,即使是自己的應用程序沒有。如何做到這一點的例子可以在this article發現,將其轉換成一個BSTR:

IntPtr bstr = Marshal.SecureStringToBSTR(password); 

try 
{ 
    // ... 
    // use the bstr 
    // ... 
} 
finally 
{ 
    Marshal.ZeroFreeBSTR(bstr); 
} 

的字符串是故意不能轉換爲託管字符串,這將再次縈繞在管理各地的未加密記憶直到它被垃圾收集。正確的方法是直接與BSTR(在finally塊中清零)相互作用,例如,使用Marshal.ReadByte。例如可以在this article中找到。

+0

我知道沒有完美的保護自己的方式。將密碼保存在臨時文件中非常糟糕。存儲在公共變量中並不理想。 我想知道哪種方式更好。完美並不是真實的,我意識到這一點。我想知道最好的選擇。 SecureString - 根據我的理解,這是最好的選擇嗎? –

+0

@MaximDroy:是的,據我所知。你需要在內存中*以某種方式*,以便能夠使用它,並且SecureString至少使得難以提取。 – Heinzi

0

你應該看看SecureString類。 它應該安全地將密碼存儲在內存中。

0

您可以爲此使用Windows ProtectedStorage。