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> 元素。 它只是一个方便存储人类可读的吊销原因的地方。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈