Partager via


Format de stockage de clé dans ASP.NET Core

Les objets sont stockés au repos dans la représentation XML. Le répertoire par défaut pour le stockage de clés est le suivant :

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

L’élément <clé>

Les clés existent en tant qu’objets de niveau supérieur dans le référentiel de clés. Par convention, les clés ont le nom de fichier key-{guid}.xml, où {guid} est l’ID de la clé. Chaque fichier de ce type contient une seule clé. Le format du fichier est le suivant.

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

L’élément <clé> contient les attributs et les éléments enfants suivants :

  • L’ID de clé. Cette valeur est traitée comme faisant autorité ; le nom de fichier est simplement une bonne chose pour la lisibilité humaine.

  • Version de l’élément <clé>, actuellement fixée à 1.

  • Dates de création, d’activation et d’expiration de la clé.

  • Élément <descripteur>, qui contient des informations sur l’implémentation de chiffrement authentifiée à l’intérieur de cette clé.

Dans l’exemple ci-dessus, l’ID de la clé est {80732141-ec8f-4b80-af9c-c4d2d1ff8901}, elle a été créée et activée le 19 mars 2015 et sa durée de vie est de 90 jours. (Parfois, la date d’activation peut être légèrement antérieure à la date de création, comme dans cet exemple. Cela est dû à un nit dans le fonctionnement des API et est inoffensif dans la pratique.)

L’élément <descripteur>

L’élément <descripteur> externe contient un attribut deserializerType, qui est le nom qualifié d’assembly d’un type qui implémente IAuthenticatedEncryptorDescriptorDeserializer. Ce type est responsable de la lecture de l’élément <descripteur> interne et de l’analyse des informations contenues à l’intérieur.

Le format particulier de l’élément <descripteur> dépend de l’implémentation de chiffrement authentifiée encapsulée par la clé, et chaque type de désérialiseur attend un format légèrement différent pour cela. Cependant, en général, cet élément contient des informations algorithmiques (noms, types, OID ou similaires) et du matériel de clé secrète. Dans l’exemple ci-dessus, le descripteur spécifie que cette clé enveloppe le chiffrement AES-256-CBC + la validation HMACSHA256.

L’élément <encryptedSecret>

Un élément <encryptedSecret> qui contient la forme chiffrée du matériel de clé secrète peut être présent si le chiffrement des secrets au repos est activé. L’attribut decryptorType est le nom qualifié d’assembly d’un type qui implémente IXmlDecryptor. Ce type est chargé de lire l’élément <encryptedKey> interne et de le déchiffrer pour récupérer le texte en clair d’origine.

Comme avec <descriptor>, le format particulier de l’élément <encryptedSecret> dépend du mécanisme de chiffrement au repos utilisé. Dans l’exemple ci-dessus, la clé principale est chiffrée à l’aide de Windows DPAPI selon le commentaire.

L’élément <révocation>

Les révocations existent en tant qu’objets de niveau supérieur dans le référentiel de clés. Par convention, les révocations ont le nom du fichier revocation-{timestamp}.xml (pour révoquer toutes les clés avant une date spécifique) ou revocation-{guid}.xml (pour révoquer une clé spécifique). Chaque fichier contient un seul élément <révocation>.

Pour les révocations de clés individuelles, le contenu du fichier sera comme ci-dessous.

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

Dans ce cas, seule la clé spécifiée est révoquée. Toutefois,i l’ID de clé est « * », comme dans l’exemple ci-dessous, toutes les clés dont la date de création est antérieure à la date de révocation spécifiée sont révoquées.

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

L’élément <raison> n’est jamais lu par le système. Il s’agit simplement d’un endroit pratique pour stocker une raison de révocation lisible par l’homme.