2012-03-07 57 views
10

我有一個讓我困擾多年的場景。如果您必須使用用戶名和密碼連接到數據庫或其他服務(如Web服務),那麼如果通過.NET程序集連接,那麼存儲此信息的最安全位置是哪裏?我知道你將不得不加密密碼,但是然後你會遇到一種雞蛋問題 - 很好 - 你可以加密它,但是你把密鑰放在哪裏?使用Windows .NET或ASP.NET應用程序時,在哪裏存儲數據庫密碼

在.NET中,您無法硬編碼密碼,因爲您可以反編譯.NET代碼。

我查看了使用基於程序集的權限與孤立存儲,但MS建議不要在那裏存儲未加密的祕密項目,因爲priveled用戶可以獲得訪問,所以我們再次將問題從A點移動到B點。因此,例如,一個不需要知道數據庫中信息的域管理員就可以獲得訪問權限,因爲他可以在域上的任何工作站上成爲管理員。

您可以加密App.Config和Web.Config,但我相信priveledges用戶可以訪問密鑰。

我想你遇到了與DPAPI相同的問題。

我曾考慮過存儲密碼,在遠程數據庫中加密並通過操作系統認證,但是我們的部門禁止在數據庫服務器上存儲密碼。我很確定我卡住了,想要確認。

+0

我知道這是前一陣子,但我已經提供了一個關於如何存儲加密密碼的問題的答案。請看一看。 – Matt 2013-03-12 08:37:41

回答

9

您不希望將密碼存儲在程序集中,重新創建輪子只會產生更多麻煩(並引入更多漏洞),而不是它的價值。如果您在數據庫和Web服務器上都使用MS平臺,那麼處理此問題的最簡單方法是use a trusted connection,並將SQL服務器上的權限授予您的應用程序正在使用的身份。其次,我只是let DPAPI do its job to encrypt your connection settings

+0

我遇到的主要問題是,我正在使用的Web和Windows應用程序運行的位置無法使用操作系統身份驗證。特別是Windows應用程序在多用戶盒子上 - 就我從文檔中可以看出的,如果我在用戶模式下使用DPAPI,則必須爲每個用戶配置不同的設置。如果我在機器模式下使用DPAPI,則所有使用DPAPI的應用程序都可以使用我的連接信息。不幸的是,我還必須使用符合FIPS 140標準的提供商,我認爲這些提供商規定了DPAPI以及RSA。我認爲最好的辦法是取出密碼。 – 2012-03-08 18:21:20

+0

Ooops。 DPAPI使用了TripleDES,我相信它是FIPS。這仍然無助於在機器模式下的多用戶訪問區域,所有使用DPAPI的應用程序(據我所知)可以訪問相同的信息 – 2012-03-08 18:24:52

+0

可以使用用戶存儲DPAPI加密配置部分。我已經用指示鏈接更新了我的答案。請注意,這些說明缺少配置應用程序池(如果使用IIS7 +)加載標識的用戶配置文件的任何指導。我想你需要打開該標誌,因爲DPAPI用戶存儲需要加載配置文件。 – HackedByChinese 2012-03-08 21:36:55

0

這裏有幾個選項。

  1. 存儲它們在在外部文件中的加密
  2. 存儲它們的配置文件,其與所生成的種子加密。混淆存儲此基本種子的代碼或將其存儲在C++ dll(難以反編譯)中。
1

這是個好問題,我一直在尋找答案。我遇到的問題是保證db密碼的安全,以防服務器遭到黑客攻擊並可能檢索到單個文件。我發現的一個非常有趣的選項是,web.config的各個部分可以通過.NET框架自動進行加密和解密,.NET框架將使用Windows安全存儲來爲您保留和檢索加密密鑰。在我無法使用的情況下,因爲我的託管服務提供商不支持它,但您可以查看此選項。爲什麼我認爲它可能會工作,就是您可以獨立管理用戶可以訪問Windows安全存儲的安全性,並顯着限制任何潛在的違規行爲。闖入服務器的黑客可能會得到配置文件和所有程序集的副本,但訪問解密密鑰對他來說是另一個障礙。

3

可以使用.NET框架以下方法來保護您的數據,他們使用的DPAPI內部保護您的數據,你可以直接在C#或VB中使用它們。NET,而無需擺弄系統DLL調用:

namespace System.Security.Cryptography 
{ 
    // Summary: 
    //  Provides methods for protecting and unprotecting data. This class cannot 
    //  be inherited. 
    public sealed class ProtectedData 
    { 
     public static byte[] Protect(byte[] userData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
     public static byte[] Unprotect(byte[] encryptedData, 
      byte[] optionalEntropy, DataProtectionScope scope); 
    } 
} 

要使用它,參考System.Security添加到您的項目。我強烈建議使用字節數組optionalEntropy將SALT添加到受保護的數據(將一些隨機值添加到字節數組,這些數據對於您要保護的數據是唯一的)。

對於scope,您可以使用DataProtectionScope.CurrentUser,它將使用當前用戶的憑據對要保護的數據進行加密。

在某些情況下,DataProtectionScope.LocalMachine也很有用。在這種情況下,受保護的數據與機器上下文相關聯。使用此設置,計算機上運行的任何進程都可以解除數據保護。它通常用於服務器特定的應用程序,該應用程序在不受信任的用戶不允許訪問的服務器上運行。

使用Protect方法加密數據,使用Unprotect進行解密。您可以根據您的應用程序(文件,數據庫,註冊表等)的要求存儲返回的字節數組。

更多關於這些方法可以在這裏找到在MSDN:

對於代碼示例和大小寫您有興趣加密config文件的應用程序的部分,檢查了這一點:

我建議你使用的零件一個鹽(即通過使用optionalEntropy參數) - 防止彩虹桌攻擊。


還有就是DPAPI解決方案的一個缺點我想提一提:關鍵是根據你的Windows憑據,這意味着誰擁有你的Windows憑據訪問產生有可能訪問受保護的數據。在您的帳戶下運行的程序也可以訪問受保護的數據。

相關問題