RSA解密Web.config节

时间:2018-07-13 21:15:10

标签: asp.net powershell web-config

我正在尝试解密从外部Powershell脚本使用RSA加密的Web.config部分。该部分为:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>Rsa Key</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>.......</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>.......</CipherValue>
      </CipherData>
    </EncryptedData>
</connectionStrings>

代码如下:

[xml]$x = Get-Content "$Path\Web.config"
$Prov = New-Object System.Configuration.RsaProtectedConfigurationProvider
$Prov.Decrypt($x.configuration.connectionStrings.EncryptedData)

它是通过配置所在服务器上的远程Powershell执行的。该帐户是管理员,因此本地计算机密钥应该可用。我收到一个错误:

Value cannot be null. Parameter name: keyName

相同的模提供者名称片段适用于DPAPI加密的部分。密钥名称就在该部分中。我在这里想念什么?

更新:当Web代码执行此操作时,它将首先在提供程序上调用Initialize()。我模仿了Initialize调用中的参数。它们来自机器。配置。

$nv = New-Object System.Collections.Specialized.NameValueCollection
$nv.Add("description", "Uses RsaCryptoServiceProvider to encrypt and decrypt")
$nv.Add("keyContainerName", "NetFrameworkConfigurationKey")
$nv.Add("cspProviderName", "")
$nv.Add("useMachineContainer", "true")
$nv.Add("useOAEP", "false")
$Prov.Initialize("RsaProtectedConfigurationProvider", $nv)

现在我遇到了另一个错误:“数据错误”。

更新2:尝试在该文件上对aspnet_regiis进行计数,得到同样的“错误数据”错误。但是该站点本身似乎已启动并正在运行,并且可以识别数据库。也许connectionString部分 损坏了,该站点将其带到其他地方。

1 个答案:

答案 0 :(得分:0)

我不确定是否要通过Powershell进行此操作,但这是我通过网页上的代码隐藏手动进行的操作。这里可能有线索。如果没有帮助,我可以删除此答案。

protected void btnEncryptConnStrings_Click(object sender, EventArgs e)
{
    // Open web.config file as a configuration object to get information.
    Configuration objConfigFile = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

    // Work with the <connectionStrings> section.
    ConfigurationSection connectionStrings = objConfigFile.GetSection("connectionStrings");

    if(connectionStrings != null)
    {
        // Only encrypt the section if it is not already protected.
        if(!connectionStrings.SectionInformation.IsProtected)
        {
            // Encrypt the <connectionStrings> section using the
            // DataProtectionConfigurationProvider provider (see notes at top of file).
            connectionStrings.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider"); // alt: DataProtectionConfigurationProvider

            objConfigFile.Save();

            // other stuff.
        }
    }
}