2011-07-05 141 views
6

投擲無效鍵錯誤所以我想利用在System.Security.Cryptography.ProtectedData對象的解除方法和不斷收到異常:System.Security.Cryptography.ProtectedData.Unprotect在某些情況下

cryptographicexception key not valid for use in specified state 

我認爲它與DataProtectionScope(但我不是100%)有關。

如果我登錄並在DEBUG模式下運行服務可執行文件,這對我意味着它將運行在「currentuser」下。但是,如果我嘗試運行在LocalSystem帳戶下運行的實際Windows服務,它將無法拋出前面提到的異常。

方法:

ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser) 

的DataProtectionScope枚舉,只有CurrentUser或LOCALMACHINE爲你的選擇。我不確定什麼是解決這個問題的最佳選擇。

我已經嘗試將其設置爲DataProtectionScope.LocalMachine,根據MSDN文章,在機器上運行的任何進程應該能夠解除保護數據。但沒有。

回答

13

Data protection API使用爲每個用戶生成的密鑰。它是一種對稱加密方案,這意味着爲用戶加密的數據不能被其他用戶解密。它不能由不同機器上的相同用戶解密。

這使得你有兩個選擇:

  • 加密,並使用相同的帳戶下運行在同一臺機器上的代碼
  • 使用CRYPTPROTECT_LOCAL_MACHINE標誌使用本機鍵,而不是用戶的
  • 解密數據

無論哪種方式,加密和解密必須以同樣的方式完成。例如,在加密和解密時使用本地機器標誌。

+0

是的,我試圖最初使用該標誌時發現兩個問題。糾正兩者後,我能夠使用LocalMachine標誌工作。 – pghtech

+3

非常有幫助 - 在我的情況下,我試圖運行我從另一個項目中獲取的代碼。它已經在使用LocalMachine,但我在一臺機器上進行了加密,並在另一臺機器上進行了解密。 – neminem

相關問題