다음을 통해 공유


키 스토리지 및 검색

키 스토리지 아키텍처

CNG는 퍼블릭 또는 프라이빗 키 암호화와 같은 암호화 기능을 사용하는 애플리케이션을 만드는 현재 및 미래의 요구 사항과 키 자료의 스토리지 요구 사항에 적응할 수 있는 프라이빗 키 스토리지에 대한 모델을 제공합니다. 키 스토리지 라우터는 이 모델의 중심 루틴이며 Ncrypt.dll 구현됩니다. 애플리케이션은 키 스토리지 라우터를 통해 시스템의 KSP(키 스토리지 공급자)에 액세스하며, 키 격리와 같은 세부 정보는 애플리케이션과 스토리지 공급자 자체 모두에서 숨겨집니다. 다음 그림에서는 CNG 키 격리 아키텍처의 디자인 및 기능을 보여 줍니다.

cng 키 스토리지 공급자

CC(공통 기준) 요구 사항을 준수하려면 수명이 긴 키를 격리하여 애플리케이션 프로세스에 존재하지 않도록 해야 합니다. CNG는 현재 Windows Server 2008 및 Windows Vista에 포함되어 있고 기본적으로 설치된 Microsoft 소프트웨어 KSP를 사용하여 비대칭 프라이빗 키의 스토리지를 지원합니다.

키 격리는 Windows Server 2008 및 Windows Vista에서 기본적으로 사용하도록 설정됩니다. 키 격리 기능은 이전에 플랫폼에서 사용할 수 없습니다. 또한 타사 KSP는 LSA(키 격리 서비스) 프로세스에 로드되지 않습니다. Microsoft KSP만 키 격리 서비스에 로드됩니다.

LSA 프로세스는 성능을 최대화하는 키 격리 프로세스로 사용됩니다. 프라이빗 키에 대한 모든 액세스는 프라이빗 키를 관리하고 사용하기 위한 포괄적인 함수 집합을 노출하는 키 스토리지 라우터를 통과합니다.

CNG는 저장된 키의 공용 부분을 프라이빗 부분과 별도로 저장합니다. 키 쌍의 공용 부분도 키 격리 서비스에서 유지 관리되며 LRPC(로컬 원격 프로시저 호출)를 사용하여 액세스됩니다. 키 스토리지 라우터는 키 격리 프로세스를 호출할 때 LRPC를 사용합니다. 프라이빗 키에 대한 모든 액세스는 프라이빗 키 라우터를 통과하고 CNG에 의해 감사됩니다.

위에서 설명한 대로 다양한 하드웨어 스토리지 디바이스를 지원합니다. 각각의 경우 이러한 모든 스토리지 디바이스에 대한 인터페이스는 동일합니다. 여기에는 키 스토리지 및 관리와 관련된 함수뿐만 아니라 다양한 프라이빗 키 작업을 수행하는 함수가 포함됩니다.

CNG는 암호화 키를 만들고, 저장하고, 검색하는 데 사용되는 API 집합을 제공합니다. 이러한 API 목록은 CNG 키 스토리지 함수를 참조하세요.

키 유형

CNG는 다음 키 형식을 지원합니다.

  • 퍼블릭 및 프라이빗 키를 Diffie-Hellman.
  • 디지털 서명 알고리즘(DSA, FIPS 186-2) 퍼블릭 및 프라이빗 키.
  • RSA(PKCS #1) 퍼블릭 및 프라이빗 키.
  • 여러 레거시(CryptoAPI) 퍼블릭 및 프라이빗 키.
  • 타원 곡선 암호화 퍼블릭 및 프라이빗 키.

지원되는 알고리즘

CNG는 다음과 같은 주요 알고리즘을 지원합니다.

알고리즘 키/해시 길이(비트)
RSA 512~16384,64비트 증분
DH 512~16384,64비트 증분
DSA 512~1024,64비트 증분
ECDSA P-256, P-384, P-521(NIST 곡선)
ECDH P-256, P-384, P-521(NIST 곡선)
MD2 128
MD4 128
MD5 128
SHA-1 160
SHA-256 256
SHA-384 384
SHA-512 512

키 디렉터리 및 파일

Microsoft 레거시 CryptoAPI CSP는 다음 디렉터리에 프라이빗 키를 저장합니다.

키 유형 디렉터리
사용자 프라이빗 %APPDATA%\Microsoft\Crypto\RSA\User SID\
%APPDATA%\Microsoft\Crypto\DSS\User SID\
로컬 시스템 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-18\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-18\
로컬 서비스 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-19\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-19\
네트워크 서비스 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-20\
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-20\
공유 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\MachineKeys

CNG는 다음 디렉터리에 프라이빗 키를 저장합니다.

키 유형 디렉터리
사용자 프라이빗 %APPDATA%\Microsoft\Crypto\Keys
로컬 시스템 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys
로컬 서비스 프라이빗 %WINDIR%\ServiceProfiles\LocalService
네트워크 서비스 프라이빗 %WINDIR%\ServiceProfiles\NetworkService
공유 프라이빗 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys

다음은 CryptoAPI와 CNG 키 컨테이너 간의 몇 가지 차이점입니다.

  • CNG는 Rsaenh.dll 및 Dssenh.dll 레거시 CSP에서 만든 키 파일과는 다른 파일 이름을 키 파일에 사용합니다. 레거시 키 파일에도 .key 확장명이 있지만 CNG 키 파일에는 .key 확장명이 없습니다.
  • CNG는 유니코드 키 컨테이너 이름을 완전히 지원합니다. CNG는 유니코드 컨테이너 이름의 해시를 사용하는 반면 CryptoAPI는 ANSI 컨테이너 이름의 해시를 사용합니다.
  • CNG는 RSA 키 쌍과 관련하여 더 유연합니다. 예를 들어 CNG는 길이가 32비트보다 큰 공용 지수를 지원하며 p와 q가 길이가 다른 키를 지원합니다.
  • CryptoAPI에서 키 컨테이너 파일은 이름이 사용자의 SID에 해당하는 텍스트와 동일한 디렉터리에 저장됩니다. 이는 더 이상 CNG의 경우는 아니어도 모든 프라이빗 키를 잃지 않고 사용자를 한 도메인에서 다른 도메인으로 이동하는 데 어려움을 겪습니다.
  • CNG KSP 및 키 이름은 MAX_PATH 유니코드 문자로 제한됩니다. CryptoAPI CSP 및 키 이름은 MAX_PATH ANSI 문자로 제한됩니다.
  • CNG는 사용자 정의 키 속성의 기능을 제공합니다. 사용자는 사용자 지정 속성을 만들고 키와 연결하고 유지 키로 저장할 수 있습니다.

키를 유지할 때 CNG는 두 개의 파일을 만들 수 있습니다. 첫 번째 파일에는 새 CNG 형식의 프라이빗 키가 포함되어 있으며 항상 만들어집니다. 이 파일은 레거시 CryptoAPI CSP에서 사용할 수 없습니다. 두 번째 파일에는 레거시 CryptoAPI 키 컨테이너에 동일한 프라이빗 키가 포함되어 있습니다. 두 번째 파일은 Rsaenh.dll 사용되는 형식과 위치를 따릅니다. 두 번째 파일의 생성은 NCryptFinalizeKey 함수를 호출하여 RSA 키를 완료할 때 NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG 플래그를 지정하는 경우에만 발생합니다. 이 기능은 DSA 및 DH 키에 대해 지원되지 않습니다.

애플리케이션이 기존 지속형 키를 열려고 하면 CNG는 먼저 네이티브 CNG 파일을 열려고 시도합니다. 이 파일이 없는 경우 CNG는 레거시 CryptoAPI 키 컨테이너에서 일치하는 키를 찾으려고 시도합니다.

UsMT(Windows 사용자 상태 마이그레이션 도구)를 사용하여 원본 컴퓨터에서 대상 컴퓨터로 CryptoAPI 키를 이동하거나 복사하면 CNG가 대상 컴퓨터의 키에 액세스하지 못합니다. 이러한 마이그레이션된 키에 액세스하려면 CryptoAPI를 사용해야 합니다.