2008-09-30 20 views
15

我需要在應用程序運行之間存儲加密數據(少量小字符串)。我不希望用戶在每次啓動應用程序時都提供密碼。即畢竟它歸結爲安全地存儲加密密鑰。使用.Net持久存儲加密數據

我正在查看RSACryptoServiceProvider並使用PersistentKeyInCsp,但我不確定它是如何工作的。關鍵容器在應用程序運行或機器重啓之間是否持久?如果是,它是用戶特定的還是機器特定的。即如果我將加密數據存儲在用戶的漫遊配置文件中,如果用戶登錄到其他計算機上,我可以解密數據嗎?

如果上述不起作用,我有什麼選擇(我需要處理漫遊配置文件)。

回答

35

Data Protection API(DPAPI)完全按照您的需要進行操作。它提供任意數據的對稱加密,使用機器的憑證或(更好)用戶作爲加密密鑰。您不必擔心管理密鑰; Windows爲你照顧。如果用戶更改密碼,Windows將使用用戶的新密碼重新加密數據。

DPAPI暴露在.NET與System.Security.Cryptography.ProtectedData類:

byte[] plaintextBytes = GetDataToProtect(); 
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser); 

保護方法的第二個參數是可選的熵字節數組,其可以被用作附加的應用特定的「祕密」。

要解密,使用ProtectedData.Unprotect電話:

byte[] encodedBytes = GetDataToUnprotect(); 
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser); 

DPAPI漫遊配置文件(如描述here),但你需要加密的數據存儲在一個地方工作正常(網絡共享, IsolatedStorage與IsolatedStorageScope.Roaming等),您的各種機器可以訪問。

請參閱MSDN中的ProtectedData類以獲取更多信息。有一個DPAPI白皮書here,比你想要的更多的信息。

+0

只是爲了子孫後代,你必須尋找到其他的代碼來處理堅持它的地方更多的「公共」(至少在你的內網爲例),使他們能夠從得到它其他機器。通常,您可以使用Environment.SpecialFolder.ApplicationData獲取機器和用戶特定的位置。 – 2008-09-30 20:02:06

0

我想添加到DPAPI方法。

雖然我自己還沒有實現用戶存儲方法,但有Microsoft用戶存儲方法文檔,它爲特定用戶加密和解密數據。

我使用了機器商店的DPAPI。我會描述它,以防它符合你想要做的事情。我使用Windows服務加載Windows用戶配置文件,並且該用戶的密碼用於加密數據。

作爲一個附註,DPAPI使用Triple-DES,它可能比AES稍微弱一點,但我不確定你要尋找什麼類型的保護。

Windows數據保護 http://msdn.microsoft.com/en-us/library/ms995355.aspx

相關問題