使用 ASP.NET Core 在 Windows 和 Azure 中静态 ASP.NET 加密

默认情况下,数据保护 系统采用发现机制 来确定如何对加密密钥进行 rest 加密。 开发人员可以替代发现机制,并手动指定密钥的加密方式。

警告

如果指定显式 密钥暂留位置,数据保护系统将取消注册默认密钥静态加密机制。 因此,密钥不再进行加密。 建议为 生产部署指定显式 密钥加密机制。 本主题中介绍了静态加密机制选项。

Azure Key Vault

若要将密钥存储在 Azure Key Vault,请配置 类中的 ProtectKeysWithAzureKeyVault Startup 的系统:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
        .ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}

有关详细信息,请参阅 Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault

Windows DPAPI

仅适用于 Windows 部署。

使用 Windows DPAPI 时,密钥材料会先使用 CryptProtectData 进行加密,然后再持久保存到存储。 DPAPI 是一种适当的加密机制,用于从不在当前计算机外部读取的数据 (尽管这些密钥可以备份到 Active Directory;请参阅 DPAPI 和漫游配置文件 部分如何排查 DPAPI (的数据保护 API) ) 。 若要配置 DPAPI 静态密钥加密,请调用 ProtectKeysWithDpapi 扩展 方法之一:

public void ConfigureServices(IServiceCollection services)
{
    // Only the local user account can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi();
}

如果 ProtectKeysWithDpapi 调用时没有参数,则只有当前 Windows 用户帐户可以解密持久化密钥环。 可以选择性地指定计算机上任何用户帐户 (当前用户帐户) 能够解密密钥环:

public void ConfigureServices(IServiceCollection services)
{
    // All user accounts on the machine can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi(protectToLocalMachine: true);
}

X.509 证书

如果应用分布在多台计算机中,则跨计算机分发共享 X.509 证书并将托管应用配置为使用证书进行静态密钥加密可能很方便:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}

由于.NET Framework限制,仅支持具有 CAPI 私钥的证书。 有关这些限制的可能解决方法,请参阅以下内容。

Windows DPAPI-NG

此机制仅在 Windows 8/Windows Server 2012 或更高版本上可用。

从 Windows 8 开始,Windows OS 支持 DPAPI-NG (也称为 CNG DPAPI) 。 有关详细信息,请参阅关于 CNG DPAPI

主体编码为保护描述符规则。 在调用 ProtectKeysWithDpapiNG的以下示例中,只有具有指定 SID 的已加入域的用户才能解密密钥环:

public void ConfigureServices(IServiceCollection services)
{
    // Uses the descriptor rule "SID=S-1-5-21-..."
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("SID=S-1-5-21-...",
        flags: DpapiNGProtectionDescriptorFlags.None);
}

还有 的无参数重载 ProtectKeysWithDpapiNG 。 使用此便捷方法指定规则"SID={CURRENT_ACCOUNT_SID}",其中 CURRENT_ACCOUNT_SID是当前 Windows 用户帐户的 SID:

public void ConfigureServices(IServiceCollection services)
{
    // Use the descriptor rule "SID={current account SID}"
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}

在此方案中,AD 域控制器负责分发 DPAPI-NG 操作使用的加密密钥。 目标用户可以从已加入域的任何计算机中 (加密的有效负载,只要进程以其标识身份) 。

使用 Windows DPAPI-NG 进行基于证书的加密

如果应用在 Windows 8.1/Windows Server 2012 R2 或更高版本上运行,可以使用 Windows DPAPI-NG 执行基于证书的加密。 使用规则描述符字符串"CERTIFICATE=HashId:THUMBPRINT",其中 THUMBPRINT 是证书的十六进制编码 SHA1 指纹:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2...B5AEA2A9BD2575A0",
            flags: DpapiNGProtectionDescriptorFlags.None);
}

指向此存储库的任何应用都必须在 Windows 8.1/Windows Server 2012 R2 或更高版本上运行,以解密密钥。

自定义密钥加密

如果框中的机制不合适,开发人员可以通过提供自定义 IXmlEncryptor来指定其自己的密钥加密机制。