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

默认情况下,数据保护系统 使用发现机制 来确定应如何静态加密加密密钥。 开发人员可以替代发现机制,并手动指定应如何静态加密密钥。

警告

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

Azure Key Vault

有关详细信息,请参阅配置 ASP.NET Core 数据保护

Windows DPAPI

仅适用于 Windows 部署。

使用 Windows DPAPI 时,系统会在将密钥材料保存到存储之前使用 CryptProtectData 进行加密。 DPAPI 加密机制适用于从未在当前计算机之外读取的数据(尽管可将这些密钥备份到 Active Directory)。 若要配置 DPAPI 静态密钥加密,请调用其中一个 ProtectKeysWithDpapi) 扩展方法:

// Only the local user account can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi();

如果在没有参数的情况下调用 ProtectKeysWithDpapi,则只有当前 Windows 用户帐户才能解密保存的密钥环。 你可以选择指定计算机上的任何用户帐户(不仅仅是当前用户帐户)都能解密密钥环:

// All user accounts on the machine can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi(protectToLocalMachine: true);

X.509 证书

如果应用分布在多台计算机上,则跨计算机分配共享的 X.509 证书(.pfx 格式)可能很方便,并将托管的应用配置为使用证书对静态密钥进行加密。

在以下示例中,将证书的指纹传递给ProtectKeysWithCertificate

services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

在以下示例中,将X509Certificate2传递给ProtectKeysWithCertificate:

var cert = new X509Certificate2(...);

services.AddDataProtection()
    .ProtectKeysWithCertificate(cert);

若要创建证书,请使用以下方法之一或任何其他合适的工具或在线服务:

有关详细信息,请参阅 使用 .NET CLI 生成自签名证书

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

Windows DPAPI-NG

此机制仅适用于 Windows 8/Windows Server 2012 或更高版本。

从 Windows 8 开始,Windows 操作系统支持 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:{CERTIFICATE THUMBPRINT}”,其中 {CERTIFICATE THUMBPRINT} 占位符是证书的十六进制编码 SHA1 指纹:

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

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

自定义密钥加密

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