Поделиться через


Формат хранилища ключей в ASP.NET Core

Объекты хранятся в неактивных данных в xml-представлении. Каталог по умолчанию для хранилища ключей:

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

Ключевой <> элемент

Ключи существуют в качестве объектов верхнего уровня в репозитории ключей. Ключи соглашения имеют имя key-{guid}.xmlфайла, где {guid} является идентификатором ключа. Каждый такой файл содержит один ключ. Формат файла выглядит следующим образом.

<?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>

Ключевой <> элемент содержит следующие атрибуты и дочерние элементы:

  • Идентификатор ключа. Это значение рассматривается как авторитетное; Имя файла является просто хорошим для удобочитаемости человека.

  • Версия ключевого <> элемента, в настоящее время исправлена в 1.

  • Даты создания, активации и окончания срока действия ключа.

  • Элемент <дескриптора> , содержащий сведения о реализации шифрования, прошедшей проверку подлинности, содержащейся в этом ключе.

В приведенном выше примере идентификатор ключа — {80732141-ec8f-4b80-af9c-c4d2d1ff8901}, он был создан и активирован 19 марта 2015 г. и имеет срок существования 90 дней. (Иногда дата активации может быть немного до даты создания, как в этом примере. Это связано с нити в том, как API работают и безвредны на практике.)

Элемент <дескриптора>

Внешний <дескриптор> содержит атрибут deserializerType, который является именем типа, реализующего IAuthenticatedEncryptorDescriptorDeserializer. Этот тип отвечает за чтение внутреннего <дескриптора> и синтаксического анализа информации, содержащейся в ней.

Определенный формат <элемента дескриптора> зависит от реализации аутентифицированного шифратора, инкапсулированной ключом, и каждый тип десериализатора ожидает немного другой формат для этого. В общем случае этот элемент будет содержать алгоритмические сведения (имена, типы, OID или аналогичные) и материалы секретного ключа. В приведенном выше примере дескриптор указывает, что этот ключ упаковывает шифрование AES-256-CBC + проверку HMACSHA256.

<Элемент EncryptedSecret>

Зашифрованный элементSecret>, содержащий зашифрованную форму материала секретного ключа, может присутствовать, если шифрование неактивных секретов включено.< Атрибут decryptorType — это имя типа, реализующего сборку IXmlDecryptor. Этот тип отвечает за чтение внутреннего <элемента encryptedKey> и расшифровку его для восстановления исходного открытого текста.

Как и в <descriptor>случае, определенный формат элемента зависит от используемого <encryptedSecret> механизма шифрования неактивных данных. В приведенном выше примере главный ключ шифруется с помощью Windows DPAPI для комментария.

Элемент <отзыва>

Отмены существуют в качестве объектов верхнего уровня в репозитории ключей. По соглашениям имеют имя revocation-{timestamp}.xml файла (для отзыва всех ключей до определенной даты) или revocation-{guid}.xml (для отзыва определенного ключа). Каждый файл содержит один <элемент отзыва> .

Для отзыва отдельных ключей содержимое файла будет указано ниже.

<?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>

В этом случае отменяется только указанный ключ. Если идентификатор ключа имеет значение "*", как показано в приведенном ниже примере, все ключи, дата создания которых до указанной даты отзыва отменяется.

<?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> никогда не считывается системой. Это просто удобное место для хранения читаемой человеком причины отзыва.