在 ASP.NET Core 中的密钥存储格式Key storage format in ASP.NET Core

本文内容

对象静态存储在 XML 表示形式中。密钥存储的默认目录为%LOCALAPPDATA%\ASP.NET\DataProtection-Keys\。

<键 > 元素The <key> element

键作为顶级对象存在于密钥存储库中。按约定键具有文件名key {guid} .xml,其中 {guid} 是密钥的 id。每个这样的文件都包含一个键。文件的格式如下所示。

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

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

  • 密钥 id。此值被视为权威值;文件名只是一种 nicety 的可读性。

  • <键 > 元素的版本,当前已固定为1。

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

  • <描述符 > 元素,其中包含有关此密钥中包含的经过身份验证的加密实现的信息。

在上面的示例中,密钥 id 是 {80732141-ec8f-4b80-af9c-c4d2d1ff8901},它是在年3月 2015 19 日创建和激活的,它的生存期为90天。(有时激活日期可能会略微早于创建日期,如本示例中所示。这是因为 Api 的工作方式吹毛求疵,在实践中是无害的。)

<说明符 > 元素The <descriptor> element

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

<描述符 > 元素的特定格式依赖于通过密钥封装的经过身份验证的加密器实现,并且每个反序列化程序类型都需要为此设置略有不同的格式。但一般情况下,此元素将包含算法信息(名称、类型、Oid 或类似)和密钥材料。在上面的示例中,描述符指定此密钥包装 AES-256-CBC encryption + HMACSHA256 验证。

<encryptedSecret > 元素The <encryptedSecret> element

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

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

<吊销 > 元素The <revocation> element

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

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

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

在这种情况下,仅吊销指定的密钥。不过,如果密钥 id 为 "*",如以下示例中所示,创建日期早于指定吊销日期的所有密钥都将被吊销。

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

系统永远不会读取 <原因 > 元素。这只是一个方便的位置,用于存储可供用户阅读的吊销原因。