다음을 통해 공유


ASP.NET Core의 하위 키 파생 및 인증된 암호화

키 링의 대부분의 키는 일종의 엔트로피를 포함하며 "CBC 모드 암호화 + HMAC 유효성 검사" 또는 "GCM 암호화 + 유효성 검사"라는 알고리즘 정보를 포함합니다. 이러한 경우 포함된 엔트로피를 이 키에 대한 마스터 키 지정 자료(또는 KM)라고 하며, 키 파생 함수를 수행하여 실제 암호화 작업에 사용할 키를 파생합니다.

비고

키는 추상이며 사용자 지정 구현은 아래와 같이 작동하지 않을 수 있습니다. 키가 기본 제공 팩터리 중 하나를 사용하는 대신 자체 구현 IAuthenticatedEncryptor 을 제공하는 경우 이 섹션에 설명된 메커니즘은 더 이상 적용되지 않습니다.

추가 인증된 데이터 및 하위 키 파생

이 인터페이스는 IAuthenticatedEncryptor 모든 인증된 암호화 작업의 핵심 인터페이스 역할을 합니다. 해당 Encrypt 메서드는 일반 텍스트와 additionalAuthenticatedData(AAD)의 두 버퍼를 사용합니다. 일반 텍스트 콘텐츠는 호출 IDataProtector.Protect을 변경하지 않고 흐르지만 AAD는 시스템에 의해 생성되고 다음 세 가지 구성 요소로 구성됩니다.

  1. 이 버전의 데이터 보호 시스템을 식별하는 32비트 매직 헤더 09 F0 C9 F0입니다.

  2. 128비트 키 ID입니다.

  3. 이 작업을 수행하는 용도 체인에서 형성된 IDataProtector 가변 길이 문자열입니다.

AAD는 세 가지 구성 요소 모두의 튜플에 대해 고유하기 때문에 모든 암호화 작업에서 KM 자체를 사용하는 대신 KM에서 새 키를 파생하는 데 사용할 수 있습니다. 호출할 IAuthenticatedEncryptor.Encrypt때마다 다음 키 파생 프로세스가 수행됩니다.

( K_E, K_H ) = SP800_108_CTR_HMACSHA512(K_M, AAD, contextHeader || keyModifier)

여기서는 다음 매개 변수를 사용하여 카운터 모드(NIST SP800-108, Sec. 5.1 참조)에서 NIST SP800-108 KDF를 호출합니다.

  • KDK(키 파생 키) = K_M

  • PRF = HMACSHA512

  • label = 추가 인증된 데이터

  • context = contextHeader || keyModifier

컨텍스트 헤더는 길이가 가변적이며, 이는 K_EK_H을 파생하는 알고리즘의 고유한 특징을 나타내는 지문으로 사용됩니다. 키 한정자는 각 호출 Encrypt 에 대해 임의로 생성되는 128비트 문자열이며 KDF에 대한 다른 모든 입력이 일정하더라도 KE 및 KH가 이 특정 인증 암호화 작업에 대해 고유할 확률이 매우 높은지 확인하는 역할을 합니다.

CBC 모드 암호화 + HMAC 유효성 검사 작업의 | K_E | 경우 대칭 블록 암호 키의 길이이며 | K_H | HMAC 루틴의 다이제스트 크기입니다. GCM 암호화 + 유효성 검사 작업의 경우 . | K_H | = 0

CBC 모드 암호화 + HMAC 유효성 검사

위의 메커니즘을 통해 생성된 후에 K_E 는 임의 초기화 벡터를 생성하고 대칭 블록 암호 알고리즘을 실행하여 일반 텍스트를 암호화합니다. 초기화 벡터 및 암호 텍스트는 MAC을 생성하기 위해 키 K_H 로 초기화된 HMAC 루틴을 통해 실행됩니다. 이 프로세스와 반환 값은 아래 그래픽으로 표시됩니다.

CBC 모드 프로세스 및 반환

output:= keyModifier || iv || E_cbc (K_E,iv,data) || HMAC(K_H, iv || E_cbc (K_E,iv,data))

비고

구현은 호출자에게 반환하기 전에 출력 앞에 매직 헤더 및 키 ID를 추가할 것입니다. 매직 헤더 및 키 ID는 암시적으로 AAD의 일부이며 키 한정자가 KDF에 대한 입력으로 공급되기 때문에 최종 반환 페이로드의 모든 단일 바이트가 MAC에서 인증됨을 의미합니다.

Galois/카운터 모드 암호화 + 유효성 검사

위의 메커니즘을 통해 생성된 후에 K_E 는 임의의 96비트 nonce를 생성하고 대칭 블록 암호 알고리즘을 실행하여 일반 텍스트를 암호화하고 128비트 인증 태그를 생성합니다.

GCM 모드 프로세스 및 반환

output := keyModifier || nonce || E_gcm (K_E,nonce,data) || authTag

비고

GCM은 기본적으로 AAD 개념을 지원하지만 AAD 매개 변수에 대해 빈 문자열을 GCM에 전달하도록 선택하여 원래 KDF에만 AAD를 공급하고 있습니다. 그 이유는 두 가지입니다. 첫째, 민첩성을 지원하기 위해 암호화 키로 직접 사용하고 K_M 싶지 않습니다. 또한 GCM은 입력에 매우 엄격한 고유성 요구 사항을 적용합니다. GCM 암호화 루틴이 동일한(키, nonce) 쌍을 가진 두 개 이상의 고유 입력 데이터 집합에서 호출될 확률은 2^-32를 초과해서는 안 됩니다. K_E을(를) 고정하면 2^-32 제한에 걸리기 전에 최대 2^32개의 암호화 작업만 수행할 수 있습니다. 이는 매우 많은 수의 작업처럼 보일 수 있지만 트래픽이 많은 웹 서버는 이러한 키의 정상적인 수명 내에 불과 며칠 만에 40억 개의 요청을 통과할 수 있습니다. 2^-32 확률 제한을 준수하기 위해 128비트 키 한정자와 96비트 nonce를 계속 사용하여 지정된 K_M모든 항목에 대해 사용 가능한 작업 수를 근본적으로 확장합니다. 디자인의 편의를 위해 CBC와 GCM 작업 간에 KDF 코드 경로를 공유하고 AAD가 이미 KDF에서 고려되므로 GCM 루틴으로 전달할 필요가 없습니다.