2012-08-29 36 views
0

我正在編寫一個winforms應用程序,該應用程序在配置文件中本地存儲用戶名和密碼,以便使用該應用程序的用戶在每次登錄時都不必重新鍵入其憑據我的應用程序支持的各種服務。密碼能夠被解密是絕對必要的,所以我選擇使用ProtectedData和Protect和Unprotect方法來安全地存儲密碼。這使得將保護他們的數據的責任傳遞給Windows和最終用戶變得容易,而不必擔心密鑰和我自己。如何允許導入/導出DPAPI安全憑證

現在我想讓用戶能夠在安裝之間移動設置。一個很好的例子就是他們希望保留大量不同帳戶設置的備份,或者他們想要移動到另一臺計算機。

我算出來是這樣的:

  1. 用戶點擊「出口佔」按鈕
  2. 應用使用解密解除
  3. 應用程序寫入設置明文「存儲的設置備份「,然後在新帳戶中輸入並重新輸入。

這一切都聽起來不錯,直到第3步。第3步讓我感到困擾,因爲它將密碼置於純文本中。在這種情況下是否有導入/導出憑證的最佳做法,或者將其視爲「可以」,以使用戶有責任保護導出的文件?對我來說,假設用戶正確保護他們的Windows帳戶,這似乎可以假設。我甚至不曾允許他們導入/導出設置文件,但這似乎是一個很大的不便。同樣,我也可以建立一個非常罕見的邊緣案例,即有人擁有如此多的存儲帳戶,以至於在短短的十年內手動重新輸入。

如果任何有經驗的人做這樣的事情會與最佳實踐/建議合作,我會很感激。我不得不處理存儲憑證的所有複雜問題。

回答

1

在給定足夠的時間和空間的情況下,您本地的Keys存儲空間可能會受到影響,我們所做的只是讓這種存儲更加困難。

當我在域中的多臺計算機上使用DPAPI進行類似的數據保護時,我留下的唯一方法就是您現在的位置。將敏感數據取消保護爲純文本。將它們複製到另一臺計算機,然後使用DPAPI保護數據。這看起來不太好,所以我放棄了將數據導出到一起的選項!並提供了另一種允許以安全方式導出敏感數據的加密方案。

這可能不是您的問題的答案,但是當涉及到導出加密數據時,使用DPAPI會讓您別無選擇,除非您有什麼設計,這就是設計。

推薦的做法是使用對稱算法(如Rijndael)來加密數據。使用非對稱算法加密對稱算法的密鑰。稍後,保存非對稱算法的公鑰/私鑰對和加密對稱算法的密鑰。導出到另一臺計算機。使用非對稱算法的私鑰解密加密的對稱算法的密鑰。然後使用對稱密鑰來解密導出的數據。

爲了把事情perspectice,當您導出:

  1. 使用RijndaelManaged原始數據進行加密。
  2. 通過使用RsaCryptoServiceProvider對RijndaelManaged進行加密來保護其使用的密鑰。
  3. 當您堅持使用RSA公鑰/私鑰對時,請確保您使用CspParameters
  4. 導出的RSA公共/私有密鑰對XML文件使用在步驟2中加密的ToXmlString
  5. 複製鍵,則在步驟4中創建的RSA密鑰對,原始加密的數據到另一臺計算機。
  6. 使用FromXmlString從XML字符串導入RSA公鑰/私鑰對。清除Xml文件容器公鑰/私鑰對。
  7. 既然您的私人(和公共)密鑰在您的新計算機中可用,請使用它來解密RijndaelManaged的密鑰。
  8. 一旦你擁有了RijndaelManaged的密鑰,就可以用它來解密原始數據。

現在,這應該足夠你的情況。這是您使用DPAPI進行常規憑證存儲的折衷方法,並且當用戶需要將憑證導出到另一臺計算機時,您可以按照上面列出的步驟1至8進行操作。

儘管在本地存儲證書不是一個好習慣,但有時爲了用戶體驗,我們並沒有真正的選擇,只是增加了加密的複雜性。

確保在使用DPAPI(也是熵值)時配置用戶級別/機器級別的保護。