首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 加密 Web.config 機密區段:connectionStrings、appSettings 保護指南

     編輯:關於ASP.NET

ASP.NET 2.0 內建 aspnet_regiis.exe 工具與 ConfigurationSection.ProtectSection API,支援使用 DPAPI(Data Protection API)或 RSA 金鑰容器加密 Web.config 敏感區段(如資料庫連線字串、API 金鑰)。本文說明命令列與程式碼兩種加密方式,以及部署至伺服器陣列的金鑰匯出入流程。

加密提供者比較

提供者加密方式適用場景跨伺服器部署
DPAPI (DataProtectionConfigurationProvider)機器層級或使用者層級金鑰單一伺服器、開發環境需同步機器金鑰或使用 RSA
RSA (RsaProtectedConfigurationProvider)RSA 金鑰容器(可匯出)伺服器陣列、雲端部署、CI/CD匯出金鑰至其他伺服器即可

方式一:命令列工具 aspnet_regiis.exe(推薦部署自動化)

加密 connectionStrings 區段

# 使用 DPAPI (機器層級)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "DataProtectionConfigurationProvider"

# 使用 RSA (需先建立金鑰容器)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "RsaProtectedConfigurationProvider"

參數說明:-pe 加密區段、-pd 解密區段、-app 應用程式虛擬路徑、-prov 指定提供者。

建立並匯出 RSA 金鑰容器(伺服器陣列必備)

# 1. 建立可匯出的 RSA 金鑰容器
aspnet_regiis -pc "MyKeys" -exp

# 2. 授予應用程式集區身分識別讀取權限
aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"
aspnet_regiis -pa "MyKeys" "IIS_IUSRS"

# 3. 匯出金鑰含私鑰(備份/部署用)
aspnet_regiis -px "MyKeys" "C:\Keys\MyKeys.xml" -pri

# 4. 於其他伺服器匯入
aspnet_regiis -pi "MyKeys" "C:\Keys\MyKeys.xml"

# 5. 設定 Web.config 使用自訂 RSA 提供者
# 見下方 Web.config 範例

方式二:程式碼動態加密(適用安裝精靈、無管理權限環境)

using System.Configuration;
using System.Web.Configuration;

public void EncryptConfigSection(string sectionName, string providerName)
{
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
    ConfigurationSection section = config.GetSection(sectionName);
    
    if (section != null && !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(providerName);
        config.Save();
    }
}

// 使用範例
EncryptConfigSection("connectionStrings", "DataProtectionConfigurationProvider");
EncryptConfigSection("appSettings", "RsaProtectedConfigurationProvider");

Web.config 設定自訂 RSA 提供者

<configuration>
  <configProtectedData>
    <providers>
      <add name="MyRsaProvider"
           type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           keyContainerName="MyKeys"
           useMachineContainer="true" />
    </providers>
  </configProtectedData>
  
  <connectionStrings configProtectionProvider="MyRsaProvider">
    <EncryptedData>...</EncryptedData>
  </connectionStrings>
</configuration>

驗證加密結果

開啟 Web.config,原明文區段將變為:

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
  <EncryptedData Type="https://www.w3.org/2001/04/xmlenc#Element" xmlns="https://www.w3.org/2001/04/xmlenc#">
    <EncryptionMethod Algorithm="https://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
    <KeyInfo xmlns="https://www.w3.org/2000/09/xmldsig#">
      <EncryptedKey xmlns="https://www.w3.org/2001/04/xmlenc#">...</EncryptedKey>
    </KeyInfo>
    <CipherData><CipherValue>...</CipherValue></CipherData>
  </EncryptedData>
</connectionStrings>

執行階段 ASP.NET 會自動解密,程式碼 ConfigurationManager.ConnectionStrings["name"].ConnectionString 無需修改即可取得明文。

解密指令(除錯/維護用)

aspnet_regiis -pd "connectionStrings" -app "/MyApp"

最佳實踐總結

  1. 預設用 DPAPI:單機部署零設定,aspnet_regiis -pe "connectionStrings" -app "/App" 即可。
  2. 叢集用 RSA:建立可匯出金鑰容器 aspnet_regiis -pc "Keys" -exp,匯出 -px、匯入 -pi。
  3. 最小權限:僅授予應用程式集區身分識別 aspnet_regiis -pa "Keys" "IIS APPPOOL\AppPoolName" 讀取金鑰權限。
  4. 不要加密整個 Web.config:僅加密 connectionStrings、appSettings、system.net/mailSettings 等敏感區段,保留其他區段可讀性。
  5. 原始碼管理:絕不 將加密後的 Web.config 提交至 Git。使用 Web.config.transform、Azure Key Vault、AWS Secrets Manager、HashiCorp Vault 管理機密。

ASP.NET Core 遷移提示

ASP.NET Core 棄用 Web.config,改用 appsettings.json + User Secrets (開發) + Azure Key Vault / Environment Variables (生產)。加密由基礎設施層處理,應用程式碼不再涉及加解密邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved