Compartir vía


Formato de almacenamiento de claves en ASP.NET Core

Los objetos se almacenan en reposo en representación XML. El directorio predeterminado para el almacenamiento de claves es:

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

Tipo de elemento <clave>

Las claves existen como objetos de nivel superior en el repositorio de claves. Por convención, las claves tienen el nombre de archivo key-{guid}.xml, donde {guid} es el identificador de la clave. Cada archivo de este tipo contiene una sola clave. El formato del archivo es el siguiente.

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

El <elemento clave> contiene los siguientes atributos y elementos secundarios:

  • Identificador de clave. Este valor se trata como autoritativo; el nombre de archivo es simplemente una buena opción para mejorar la legibilidad humana.

  • La versión del <elemento clave>, actualmente corregida en 1.

  • Fechas de creación, activación y expiración de la clave.

  • Elemento <descriptor> , que contiene información sobre la implementación de cifrado autenticada contenida en esta clave.

En el ejemplo anterior, el identificador de la clave es {80732141-ec8f-4b80-af9c-c4d2d1ff8901}, se creó y activó el 19 de marzo de 2015 y tiene una duración de 90 días. (En ocasiones, la fecha de activación podría estar ligeramente antes de la fecha de creación, como en este ejemplo. Esto se debe a una nit en el funcionamiento de las API y es inofensivo en la práctica).

Elemento <descriptor>

El elemento descriptor< externo >contiene un atributo deserializerType, que es el nombre completo del ensamblado de un tipo que implementa IAuthenticatedEncryptorDescriptorDeserializer. Este tipo es responsable de leer el elemento descriptor< interno >y analizar la información contenida en.

El formato concreto del <elemento descriptor> depende de la implementación del cifrador autenticado encapsulada por la clave y cada tipo de deserializador espera un formato ligeramente diferente para esto. Sin embargo, en general, este elemento contendrá información algorítmica (nombres, tipos, OID o similares) y material de clave secreta. En el ejemplo anterior, el descriptor especifica que esta clave encapsula el cifrado AES-256-CBC + validación de HMACSHA256.

El elemento <encryptedSecret>

Un <elemento encryptedSecret> que contiene la forma cifrada del material de clave secreta puede estar presente si está habilitado el cifrado de secretos en reposo. El atributo decryptorType es el nombre completo del ensamblado de un tipo que implementa IXmlDecryptor. Este tipo se encarga de leer el elemento<encryptedKey> y descifrarlo para recuperar el texto plano original.

Al igual que con <descriptor>, el formato concreto del <encryptedSecret> elemento depende del mecanismo de cifrado en reposo en uso. En el ejemplo anterior, la clave maestra se cifra mediante DPAPI de Windows según el comentario.

Elemento <de revocación>

Las revocaciones existen como objetos de nivel superior en el repositorio de claves. Por revocación de convención, el nombre de archivo revocation-{timestamp}.xml (para revocar todas las claves antes de una fecha específica) o revocation-{guid}.xml (para revocar una clave específica). Cada archivo contiene un único <elemento de revocación> .

Para las revocaciones de claves individuales, el contenido del archivo será el siguiente.

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

En este caso, solo se revoca la clave especificada. Sin embargo, si el identificador de clave es "*", como en el ejemplo siguiente, se revocan todas las claves cuya fecha de creación es anterior a la fecha de revocación especificada.

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

El elemento de <razón> nunca es leído por el sistema. Es simplemente un lugar conveniente para almacenar una razón legible para la revocación.