ASP.NET Core 中的数据保护密钥管理和生存期Data Protection key management and lifetime in ASP.NET Core

本文内容

作者:Rick Anderson

密钥管理Key management

应用会尝试检测其操作环境并自行处理密钥配置。

  • 如果应用托管在Azure 应用中,则密钥将保留在 %HOME%\ASP.NET\DataProtection-Keys文件夹中。此文件夹由网络存储提供支持,并跨托管应用的所有计算机同步。

    • 密钥不是静态保护的。
    • DataProtection文件夹在单个部署槽位中向应用的所有实例提供密钥环。
    • 各部署槽位(例如过渡槽和生成槽)不共享密钥环。当你在部署槽之间进行交换时(例如,将暂存交换到生产环境或使用 A/B 测试),任何使用数据保护的应用都将无法使用上一个槽内的密钥环来解密存储的数据。这会导致用户注销使用标准 ASP.NET Core cookie 身份验证的应用,因为它使用数据保护来保护其 cookie。如果需要与槽无关的密钥环,请使用外部密钥环形提供程序,例如 Azure Blob 存储、Azure Key Vault、SQL 存储或 Redis 缓存。
  • 如果用户配置文件可用,则密钥将保留在 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys文件夹中。如果操作系统为 Windows,则使用 DPAPI 对密钥进行静态加密。

同时还必须启用应用池的 setProfileEnvironment attributesetProfileEnvironment 的默认值为 true。在某些情况下(例如,Windows 操作系统),将 setProfileEnvironment 设置为 false。如果密钥未按预期存储在用户配置文件目录中,请执行以下操作:

  • 导航到 %windir%/system32/inetsrv/config 文件夹。
  • 打开 applicationHost.config 文件。
  • 找到 <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> 元素。
  • 确认 setProfileEnvironment 属性不存在,这会将值默认设置为 true,或者将属性的值显式设置为 true
    • 如果应用托管在 IIS 中,则密钥将保留在仅列入工作进程帐户的特殊注册表项中的 HKLM 注册表中。使用 DPAPI 对密钥静态加密。
  • 如果这些条件都不匹配,则不会在当前进程的外部保留键。当进程关闭时,所有生成的密钥都将丢失。

开发人员始终处于完全控制下,并且可以重写存储键的方式和位置。上述前三个选项应为大多数应用提供良好的默认设置,这与 ASP.NET <machineKey > 自动生成例程在过去的工作方式类似。最终的回退选项是要求开发人员在需要进行密钥持久性的情况下预先指定配置的唯一方案,但只有在极少数情况下才会发生此回退。

在 Docker 容器中托管时,密钥应保留在一个文件夹中,该文件夹是 Docker 卷(共享卷或主机装载的卷,该卷会超出容器的生存期)或外部提供程序(如Azure Key VaultRedis)。如果应用无法访问共享的网络卷,则外部提供程序在 web 场方案中也很有用(有关详细信息,请参阅PersistKeysToFileSystem )。

警告

如果开发人员覆盖上述规则,并在特定的密钥存储库中指向数据保护系统,将禁用静态密钥的自动加密。可以通过配置重新启用静态保护。

密钥生存期Key lifetime

默认情况下,密钥的生存期为90天。密钥过期后,应用会自动生成新密钥,并将新密钥设置为活动密钥。只要已停用的密钥仍保留在系统中,你的应用就可以对任何受其保护的数据进行解密。有关详细信息,请参阅密钥管理

默认算法Default algorithms

使用的默认负载保护算法为 AES-256-CBC,以实现保密性,使用 HMACSHA256 进行身份验证。512位主密钥(每90天更改一次)用于根据每个有效负载派生用于这些算法的两个子项。有关详细信息,请参阅子项派生

其他资源Additional resources