보안 키 삽입
보안 키 주입은 신뢰할 수 없는 클라이언트를 통해 서버 애플리케이션에서 스마트 카드로 중요한 자료를 암호화된 전송을 지원합니다. 보안 키 주입이 제대로 작동하려면 다음 단계를 수행해야 합니다.
암호화 키 설정:
- 서버와 클라이언트의 스마트 카드 간에 공유 대칭 키를 사용합니다.
- 서버에서 임시 대칭 세션 키를 생성하고 스마트 카드로 가져옵니다. 세션 키는 스마트 카드에 생성된 해당 프라이빗 키가 있는 공개 키로 암호화해야 합니다.
- 공유 대칭 키에서 세션 키를 파생시킵니다. 자세한 내용은 CardGetSharedKeyHandle을 참조하세요.
- DH 키 파생을 사용합니다.
서버의 데이터 암호화:
- 데이터는 PIN과 같은 인증 데이터일 수 있습니다.
- 데이터는 RSA/ECC와 같은 비대칭 키 쌍일 수 있습니다.
클라이언트의 스마트 카드에 있는 데이터의 암호 해독
다음 다이어그램에서는 키를 생성한 다음 트러스트 경계를 넘어 클라이언트로 안전하게 전송하는 서버 애플리케이션을 보여 줍니다. 키를 받은 후 클라이언트는 해당 키를 스마트 카드로 가져옵니다. 마지막 단계로, 보관을 위해 키를 CA로 가져옵니다. 암호화된 채널은 서버 애플리케이션과 스마트 카드 사이에 있어야 하며 클라이언트 애플리케이션/미니 드라이버는 암호화된 데이터에 액세스할 수 없어야 합니다.

2단계에서 키를 암호화하려면 서버와 스마트 카드에 공유 대칭 키가 필요합니다.
보안 키 삽입을 수행할 때 독점 형식을 사용하는 기존 카드를 수용하기 위해 카드가 없는 서버 쪽에 미니 드라이버를 로드할 수 있습니다. 미니 드라이버는 메시지의 형식을 지정한 다음 마지막으로 암호화하여 클라이언트에서 실행되는 동일한 미니 드라이버가 메시지의 암호를 해독할 수 있도록 합니다.
다음 다이어그램에서는 미니 드라이버가 포함된 서버/클라이언트 키 보관에 대한 개요를 제공합니다.

카드 키 핸들
대칭 키를 처리할 때 CARD_KEY_HANDLE 사용하여 키 핸들을 전달해야 합니다.
typedef ULONG_PTR CARD_KEY_HANDLE;
카드 모드 없음
신뢰할 수 없는 클라이언트에 설치된 동일한 미니 드라이버를 사용하여 데이터 형식을 지정하고 암호화하는 서버 애플리케이션을 용이하게 하기 위해 카드가 없을 모드에서 CardAcquireContext 를 호출할 수 있습니다. 이 모드는 CardAcquireContext의 dwFlags 매개 변수에서 다음 플래그를 설정하여 활성화됩니다.
#define CARD_SECURE_KEY_INJECTION_NO_CARD_MODE 0x1
이 설정은 CardAcquireContext 가 판독기에서 어떤 카드도 기대하지 않도록 지시합니다. 즉 , CARD_DATA ATR 필드가 채워지지 않고 hSCard 및 hSCardCtx 가 0으로 설정됩니다.
이 플래그가 설정되면 미니 드라이버는 다음 함수 호출만 수락할 수 있습니다.
- MDImportSessionKey
- MDEncryptData
- CardGetSharedKeyHandle
- CardGetAlgorithmProperty
- CardDestroyKey
- CardGetKeyProperty
- CardSetKeyProperty
- CardProcessEncryptedData
보안 키 주입에 대한 사용 사례 시나리오
이 예제 시나리오에서 클라이언트 애플리케이션은 스마트 카드 소유자를 대신하여 서버에서 실행 중인 CA 애플리케이션에서 인증서를 발급할 것을 요청합니다. CA에는 키 보관도 필요합니다. 비대칭 키페어를 사용하여 임시 대칭 세션 키를 설정하는 방법에 대한 지침은 보안 키 삽입 섹션의 각주를 참조하세요.
사용자 키는 서버 쪽에서 생성되고, 보관된 다음, 보안 키 삽입 기능을 사용하여 사용자의 스마트 카드에 삽입됩니다. 다음 그림에서는 프로세스를 보여 줍니다.

이 시나리오는 비대칭 키로 암호화된 대칭 세션 키를 가져온 다음 후속 키 래핑에 이 대칭 키를 사용하는 것을 기반으로 합니다.
다음 단계에서는 이전 그림과 같이 프로세스를 설명합니다.
클라이언트 애플리케이션은 서버에서 실행 중인 CA 애플리케이션에서 새 인증서를 요청합니다.
클라이언트의 요청을 받으면 서버 애플리케이션은 인증서 템플릿이 키 복구를 위해 구성되었음을 감지합니다. 결과적으로 서버 애플리케이션은 보안 키 삽입 프로토콜을 시작합니다.
클라이언트 애플리케이션은 CP_KEY_IMPORT_SUPPORT CardGetProperty 를 호출하여 다음을 검색합니다.
- 카드가 보안 키 주입을 지원하는지 여부입니다.
- 지원되는 대칭 키 가져오기 메서드입니다.
- 지원되는 알고리즘입니다.
미니 드라이버는 클라이언트 애플리케이션에 비대칭 메커니즘(CARD_KEY_IMPORT_ASYMMETRIC_KEYEST)을 통한 키 삽입을 지원한다는 것을 나타냅니다.
클라이언트 애플리케이션은 스마트 카드의 컨테이너 맵 파일을 통해 키 가져오기에 유용한 컨테이너가 있는지 확인합니다. 없는 경우 클라이언트 애플리케이션은 CardCreateContainer 를 호출하여 새 키 쌍을 생성합니다.
미니 드라이버는 스마트 카드에 키 쌍을 만들도록 지시합니다.
스마트 카드는 키를 만든 후 미니 드라이버에 키를 반환합니다.
미니 드라이버는 키가 생성되었다는 표시를 클라이언트 애플리케이션에 반환합니다.
이제 클라이언트 애플리케이션은 CardGetContainerInfo 를 호출하여 6단계에서 만든 키 쌍의 공개 키를 내보냅니다.
카드 미니 드라이버는 공개 키를 반환하도록 카드에 지시합니다.
카드에서 공개 키(K1)를 추출하여 미니 드라이버로 반환합니다.
미니 드라이버는 클라이언트 애플리케이션에 K1을 반환합니다.
클라이언트 애플리케이션은 CardGetProperty 를 호출하여 카드에서 지원하는 대칭 알고리즘을 열거하고 K1과 함께 사용할 수 있는 패딩 체계를 열거합니다.
미니 드라이버는 지원되는 알고리즘 및 패딩 모드를 반환합니다.
클라이언트 애플리케이션은 카드에서 지원하는 대칭 키 알고리즘 및 패딩 모드를 설명하는 정보와 함께 K1을 서버 애플리케이션으로 다시 보냅니다.
서버 애플리케이션은 카드에서 지원하는 알고리즘 중 하나를 사용하여 대칭 키(S1)를 생성합니다. 대칭 키 S1은 K1로 암호화되어 클라이언트 애플리케이션으로 반환됩니다. 또한 서버 애플리케이션은 암호화 알고리즘 및 S1 암호화에 사용된 패딩 유형에 대한 정보를 반환합니다.
클라이언트 애플리케이션은 K1에 대한 참조 및 BLOB 암호 해독에 사용할 패딩 정보와 함께 암호화된 키 데이터 BLOB을 사용하여 CardImportSessionKey 를 호출합니다.
주요 데이터 BLOB에 대한 자세한 내용은 BCRYPT_KEY_DATA_BLOB_HEADER 참조하세요.
미니 드라이버는 암호 해독을 위해 암호화된 BLOB 데이터를 스마트 카드에 전달합니다.
대칭 키의 암호를 해독한 후 스마트 카드는 대칭 키에 대한 참조를 미니 드라이버에 반환합니다.
미니 드라이버는 대칭 키에 대한 클라이언트 애플리케이션에 키 핸들을 반환합니다.
클라이언트 애플리케이션은 대칭 키를 가져온 서버 애플리케이션에 승인을 보냅니다.
서버 애플리케이션은 MDImportSessionKey를 호출하여 S1을 서버 쪽 미니 드라이버로 가져옵니다.
서버 쪽 미니 드라이버는 S1을 성공적으로 가져왔음을 나타내는 성공을 반환합니다.
서버 애플리케이션은 비대칭 키 쌍(K2)을 생성합니다. K2는 MDEncryptData를 호출하여 서버 쪽 미니 드라이버로 전송됩니다. 서버 애플리케이션은 IV 및 체인 모드를 생성하고 CardSetKeyProperty를 호출하여 이 정보를 서버 쪽 미니 드라이버로 설정합니다.
서버 쪽 미니 드라이버는 S1을 사용하여 K2를 암호화하고 암호화된 K2를 서버 애플리케이션에 반환합니다.
서버 애플리케이션은 암호화와 관련된 정보와 함께 encryptedK2를 클라이언트 애플리케이션에 보냅니다. 여기에는 IV 및 체인 모드 정보가 포함됩니다.
클라이언트 애플리케이션은 CardSetKeyProperty 를 호출하여 미니 드라이버에 S1과 함께 사용할 IV 및 체인 모드를 지시합니다. 그런 다음 클라이언트 애플리케이션은 다음 데이터를 사용하여 CardProcessEncryptedData 를 호출합니다.
- K2를 포함하는 암호화된 키 데이터 BLOB입니다.
- 카드가 데이터의 암호를 해독하고 키를 만들 수 있도록 S1에 대한 키 참조입니다.
미니 드라이버는 새 키 컨테이너를 준비하는 데 필요한 단계를 수행하고 암호화된 키 데이터 BLOB을 스마트 카드에 제공합니다.
스마트 카드는 S1을 사용하여 K2의 암호를 해독하고 K2에 대한 새 키 컨테이너를 생성합니다. 이 카드는 키를 가져왔음을 나타내는 성공을 반환합니다.
미니 드라이버는 CardProcessEncryptedData에서 성공을 반환합니다.
클라이언트 애플리케이션이 성공을 반환하고 프로세스가 완료되었습니다.