System.Configuration 提供 Protected Configuration Provider:
# 開啟 Developer Command Prompt for VS (管理員權限)
aspnet_regiis -pc "MyAppKeys" -exp
-pc:建立機器層級金鑰容器。-exp:標記為可匯出 (含私鑰),否則無法匯出至其他伺服器。
# IIS 7.5+ 預設應用程式集區身分為 IIS AppPool\{AppPoolName}
# 查詢實際身分:在 .aspx 寫 <%= System.Security.Principal.WindowsIdentity.GetCurrent().Name %>
aspnet_regiis -pa "MyAppKeys" "IIS AppPool\MyAppPool"
# 或傳統帳號
aspnet_regiis -pa "MyAppKeys" "NT AUTHORITY\NETWORK SERVICE"
<configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0">
<configProtectedData>
<providers>
<add name="MyAppRsaProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
keyContainerName="MyAppKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>
<connectionStrings configProtectionProvider="MyAppRsaProvider">
<EncryptedData>...</EncryptedData>
</connectionStrings>
<appSettings configProtectionProvider="MyAppRsaProvider">
<EncryptedData>...</EncryptedData>
</appSettings>
</configuration>
# 加密 connectionStrings
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "MyAppRsaProvider"
# 加密 appSettings
aspnet_regiis -pe "appSettings" -app "/MyApp" -prov "MyAppRsaProvider"
# 指定實體路徑 (非 IIS 虛擬路徑)
aspnet_regiis -pef "connectionStrings" "C:\Inetpub\wwwroot\MyApp" -prov "MyAppRsaProvider"
# 來源伺服器匯出 (含私鑰,需 -exp)
aspnet_regiis -px "MyAppKeys" "C:\Keys\MyAppKeys.xml" -pri
# 複製 XML 至目標伺服器,匯入
aspnet_regiis -pi "MyAppKeys" "C:\Keys\MyAppKeys.xml" -exp
# 目標伺服器同樣授予權限
aspnet_regiis -pa "MyAppKeys" "IIS AppPool\MyAppPool"
ASP.NET 執行階段**自動解密**,程式碼完全不需修改:
string connStr = ConfigurationManager.ConnectionStrings["MyDb"].ConnectionString;
// 直接取得明文,框架內部自動解密
string apiKey = ConfigurationManager.AppSettings["ApiKey"];
以下區段在 configProtectedData 之前處理,**無法加密**:
<processModel><runtime><mscorlib><startup><system.runtime.remoting><configProtectedData> (本身)<satelliteAssemblies><cryptographySettings><cryptoNameMapping><cryptoClasses>
# 使用預設 DPAPI Provider (機器層級)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "DataProtectionConfigurationProvider"
# 或使用者層級 (需載入使用者設定檔)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "DataProtectionConfigurationProvider" -pku
優點:無需管理金鑰容器。缺點:無法跨機器同步、金鑰綁定機器/使用者。
開啟 Web.config,應見類似:
<connectionStrings configProtectionProvider="MyAppRsaProvider">
<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#">
<EncryptionMethod Algorithm="https://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo><KeyName>MyAppKeys</KeyName></KeyInfo>
<CipherData><CipherValue>...</CipherValue></CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData><CipherValue>...</CipherValue></CipherData>
</EncryptedData>
</connectionStrings>
aspnet_regiis -pd "connectionStrings" -app "/MyApp"
aspnet_regiis -pdf "connectionStrings" "C:\Inetpub\wwwroot\MyApp"
AppName_Env_Keys (如 MyApp_Prod_Keys)。-px 匯出 XML 存放於離線保險庫 (HSM/加密 USB/密碼管理器)。-pa 讀取權限,不授予系統管理員。aspnet_regiis -pef。dotnet user-secrets set。ConfigurationBuilder 依優先序載入,敏感值不落地。