ASP.NET Core의 키 스토리지 형식

개체는 XML 표현으로 저장됩니다. 키 스토리지의 기본 디렉터리는 다음과 같습니다.

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

<키> 요소

키는 키 리포지토리에 최상위 개체로 존재합니다. 규칙 키에는 파일 이름이 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>

<키> 요소는 다음 특성 및 자식 요소를 포함합니다.

  • 키 ID입니다. 이 값은 신뢰할 수 있는 값으로 처리됩니다. 파일 이름은 단순히 사람이 쉽게 읽을 수 있는 좋은 이름입니다.

  • 현재 1로 고정된 <키> 요소의 버전입니다.

  • 키의 생성, 활성화 및 만료 날짜입니다.

  • 이 키 내에 포함된 인증된 암호화 구현에 대한 정보를 포함하는 <설명자> 요소입니다.

위의 예제에서 키의 ID는 {80732141-ec8f-4b80-af9c-c4d2d1ff8901}이며, 2015년 3월 19일에 만들어지고 활성화되었으며, 수명은 90일입니다. (경우에 따라 활성화 날짜는 이 예제와 같이 생성 날짜 약간 이전일 수 있습니다. 이는 API 작동 방식의 nit 때문에 발생하며 실제로는 무해합니다.)

<설명자> 요소

외부 <설명자> 요소에는 IAuthenticatedEncryptorDescriptorDeserializer를 구현하는 형식의 정규화된 어셈블리 이름인 deserializerType 특성이 포함됩니다. 이 형식은 내부 <설명자> 요소를 읽고 포함된 정보를 구문 분석하는 작업을 담당합니다.

<설명자> 요소의 특정 형식은 키로 캡슐화된 인증된 암호화기 구현에 따라 다르며, 각 역직렬 변환기 형식에는 약간 다른 형식이 있어야 합니다. 그러나 일반적으로 이 요소에는 알고리즘 정보(이름, 형식, OID 또는 이와 유사한) 및 비밀 키 자료가 포함됩니다. 위의 예제에서 설명자는 이 키가 AES-256-CBC encryption + HMACSHA256 유효성 검사를 래핑한다고 지정합니다.

<encryptedSecret> 요소

미사용 비밀의 암호화를 사용하는경우 암호화된 형식의 비밀 키 자료를 포함하는 <encryptedSecret> 요소가 있을 수 있습니다. 특성 decryptorType 은 구현하는 형식의 어셈블리 정규화된 이름입니다 IXmlDecryptor. 이 형식은 내부 < encryptedKey> 요소를 읽고 해독하여 원래 일반 텍스트를 복구합니다.

<descriptor>와 마찬가지로 <encryptedSecret> 요소의 특정 형식은 사용 중인 미사용 암호화 메커니즘에 따라 달라집니다. 위의 예제에서 마스터 키는 주석당 Windows DPAPI를 사용하여 암호화됩니다.

<해지> 요소

해지는 키 리포지토리에 최상위 개체로 존재합니다. 규칙에 따라 해지되는 파일 이름(특정 날짜 이전에 모든 키를 해지하기 위한) 또는 revocation-{guid}.xml (특정 키를 해지하기 위한) 파일 이름이 revocation-{timestamp}.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>

이 경우 지정된 키만 해지됩니다. 그러나 키 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>

<이유> 요소는 시스템에서 읽지 않습니다. 단순히 사람이 읽을 수 있는 해지 이유를 저장하는 편리한 위치입니다.