ASP.NET Core 中的密钥存储格式

对象以 XML 表示形式静态存储。 密钥存储的默认目录为:

  • Windows:*%LOCALAPPDATA%\ASP.NET\DataProtection-Keys*
  • macOS / Linux:$HOME/.aspnet/DataProtection-Keys

<key> 元素

密钥作为密钥存储库中的顶级对象存在。 按照惯例,密钥的文件名为 key-{guid}.xml,其中 {guid} 是密钥的 ID。 每个这样的文件都包含一个密钥。 该文件的格式如下。

<?xml version="1.0" encoding="utf-8"?>
<key id="80732141-ec8f-4b80-af9c-c4d2d1ff8901" version="1">
  <creationDate>2015-03-19T23:32:02.3949887Z</creationDate>
  <activationDate>2015-03-19T23:32:02.3839429Z</activationDate>
  <expirationDate>2015-06-17T23:32:02.3839429Z</expirationDate>
  <descriptor deserializerType="{deserializerType}">
    <descriptor>
      <encryption algorithm="AES_256_CBC" />
      <validation algorithm="HMACSHA256" />
      <enc:encryptedSecret decryptorType="{decryptorType}" xmlns:enc="...">
        <encryptedKey>
          <!-- This key is encrypted with Windows DPAPI. -->
          <value>AQAAANCM...8/zeP8lcwAg==</value>
        </encryptedKey>
      </enc:encryptedSecret>
    </descriptor>
  </descriptor>
</key>

<key> 元素包含以下属性和子元素:

  • 密钥 ID。此值被视为权威值;文件名只是为了方便人类阅读。

  • <key> 元素的版本,目前固定为 1。

  • 密钥的创建、激活和到期日期。

  • <descriptor> 元素,其中包含有关此密钥中包含的已验证加密实现的信息。

在上面的示例中,密钥 ID 为 {80732141-ec8f-4b80-af9c-c4d2d1ff8901},它是在 2015 年 3 月 19 日创建并激活的,生存期为 90 天。 (有时,激活日期可能稍早于创建日期,如本示例所示。这是由于 API 的工作方式存在缺陷,但在实践中是无害的。)

<descriptor> 元素

外部 <descriptor> 元素包含属性 deserializerType,它是实现 IAuthenticatedEncryptorDescriptorDeserializer 的类型的程序集限定名称。 此类型负责读取内部 <descriptor> 元素并分析其中包含的信息。

<descriptor> 元素的特定格式取决于密钥封装的已验证加密程序实现,并且每种反序列化程序类型对此元素的格式要求略有不同。 不过,一般来说,此元素将包含算法信息(名称、类型、OID 或类似信息)和密钥材料。 在上面的示例中,描述符指定此密钥包装 AES-256-CBC 加密和 HMACSHA256 验证。

<encryptedSecret> 元素

如果启用机密静态加密,则可能会出现包含加密形式的密钥材料的 <encryptedSecret> 元素。 属性 decryptorType 是实现 IXmlDecryptor 的类型的程序集限定名称。 此类型负责读取内部 <encryptedKey> 元素,并对其进行解密以恢复原始纯文本。

<descriptor> 一样,<encryptedSecret> 元素的特定格式取决于正在使用的静态加密机制。 在上面的示例中,系统根据注释使用 Windows DPAPI 对主密钥进行加密。

<revocation> 元素

吊销作为密钥存储库中的顶级对象存在。 按照惯例,吊销的文件名为 revocation-{timestamp}.xml(用于吊销特定日期之前的所有密钥)或 revocation-{guid}.xml(用于吊销特定密钥)。 每个文件都包含一个 <revocation> 元素。

对于单个密钥的吊销,文件内容如下所示。

<?xml version="1.0" encoding="utf-8"?>
<revocation version="1">
  <revocationDate>2015-03-20T22:45:30.2616742Z</revocationDate>
  <key id="eb4fc299-8808-409d-8a34-23fc83d026c9" />
  <reason>human-readable reason</reason>
</revocation>

在本例中,仅吊销指定密钥。 但是,如果密钥 ID 是“*”(如以下示例所示),所有创建日期早于指定吊销日期的密钥都将被吊销。

<?xml version="1.0" encoding="utf-8"?>
<revocation version="1">
  <revocationDate>2015-03-20T15:45:45.7366491-07:00</revocationDate>
  <!-- All keys created before the revocation date are revoked. -->
  <key id="*" />
  <reason>human-readable reason</reason>
</revocation>

系统永远不会读取 <reason> 元素。 它只是一个方便存储人类可读的吊销原因的地方。