PKCS #11 소개-표준 플랜
PKCS #11은 암호화 정보를 보유하고 암호화 기능을 수행하는 디바이스에 대해 Cryptoki라고 하는 API(Application Programming Interface)를 지정하는 표준입니다. Cryptoki API는 단순 오브젝트 기반 접근법을 준수합니다. 이 접근법에서는 암호화 토큰이라는 디바이스의 공통적인 논리 보기를 애플리케이션에 제공하는 기술 독립 및 자원 공유 목표에 대해 설명합니다.
Cryptoki는 암호화 디바이스의 세부사항으로부터 애플리케이션을 격리합니다. 애플리케이션은 인터페이스를 다른 유형의 디바이스로 변경하거나 다른 환경에서 실행할 필요가 없습니다. 따라서 이 애플리케이션은 이식 가능합니다.Cryptoki API의 함수는 다음과 같은 카테고리로 구성되어 있습니다.
- 범용 함수 (네 개의 함수)
- 슬롯 및 토큰 관리 기능 (9개의 기능)
- 세션 관리 기능 (8개의 기능)
- 오브젝트 관리 기능 (9개의 기능)
- 암호화 기능 (네 개의 기능)
- 암호 해독 함수 (네 개의 함수)
- 메시지 요약 기능 (5개의 기능)
- 서명, 확인 및 MAC 기능 (12개기능)
- 이중 목적 암호화 기능 (네 개의 기능)
- 키 관리 기능 (5개의 기능)
- 난수 생성 함수 (두 개의 함수)
- 병렬 기능 관리 기능 (두 개의 기능)
모든 PKCS #11 함수가 IBM Cloud® Hyper Protect Crypto Services에 의해 구현되는 것은 아닙니다. 구현된 PKCS #11 함수는 지원되는 PKCS #11 함수를 참조하십시오.
PKCS #11 표준 문서를 검토하려면 다음을 참조하십시오.
- Cryptographic Token Interface Usage Guide 버전 2.40
- Cryptographic Token Interface Base Specification 버전 2.40 Plus Errata 01
- 암호화 토큰 인터페이스 현재 메커니즘 스펙 버전 2.40 Plus Errata 01
PKCS #11 구현 컴포넌트
PKCS #11 API를 연결하고 사용하려면 Hyper Protect Crypto Services에 의해 구현되는 PKCS #11 API 및 GREP11 API와의 관계를 파악해야 합니다. 자세한 정보는 PKCS #11 API와 GREP11 API의 비교를 참조하십시오. PKCS #11 API가 지원되는 경우 PKCS #11 표준을 사용하는 기존 애플리케이션을 변경할 필요가 없습니다. Hyper Protect Crypto Services에서는 PKCS #11 함수를 통해 생성된 암호화 키를 저장하기 위해 격리된 키 저장소도 제공합니다. 이러한 키는 마스터 키로 보호되며 애플리케이션에서는 로컬로 키 파일을 확인할 수 없습니다.
PKCS #11 API를 사용하려면 먼저 PKCS #11 라이브러리를 설치하십시오. 이러한 방식으로 PKCS #11 애플리케이션은 PKCS #11 라이브러리와 상호작용한 후 gRPC를 통해 Hyper Protect Crypto Services에 의해 구현되는 암호화 함수를 호출할 수 있습니다. 다음 다이어그램은 Hyper Protect Crypto Services PKCS #11 라이브러리에 의해 구현되는 주요 컴포넌트 및 여러 컴포넌트 간의 상호작용을 보여줍니다.
다음 절에서는 각 PKCS #11 컴포넌트에 대해 자세히 설명합니다.
애플리케이션
애플리케이션은 단일 주소 공간 내에서 실행됩니다. 모든 제어 스레드가 애플리케이션에서 실행됩니다. 스레드 중 하나에서 Cryptoki 함수인 C_Initialize
를 호출하면 애플리케이션은 Cryptoki 애플리케이션이 됩니다. 이 호출이 수행되면 애플리케이션은 다른 Cryptoki 함수를 호출할 수 있습니다. 애플리케이션에서 Cryptoki 사용이 완료되면 애플리케이션은 Cryptoki 함수인 C_Finalize
를
호출하여 Cryptoki 애플리케이션이 되지 않도록 합니다.
IBM Z (s390x) 플랫폼에서 SunPKCS11 제공자를 사용하여 Java PKCS #11 애플리케이션을 실행 중인 경우, 애플리케이션을 시작할 때 최신 IBM Semeru JVM을 사용하고 -Xjit:noResumableTrapHandler
Java 옵션을 지정해야 합니다. IBM Semeru 런타임 다운로드 페이지에서 아키텍처 필터 필드를 s390x 로 변경하여 IBM Semeru JVM의 최신 s390x 버전을 다운로드할 수 있습니다.
사용자
PKCS #11 표준에서는 로그인을 위한 두 가지 사용자 유형인 보안 담당자(SO) 및 일반 사용자를 정의합니다.사용자가 C_Login
Cryptoki 함수를 사용하여 로그인하지 않으면 사용자는 익명 사용자라고도 합니다.일반 사용자만 토큰의 개인용 오브젝트에 액세스할 수 있으며 일반 사용자가 인증된 이후에만 해당 액세스 권한이 부여됩니다. Hyper Protect Crypto Services PKCS
#11 구현에서 API 키로 보안 담당자 및 일반 사용자가 인증됩니다. 익명 사용자도 지원됩니다.PKCS #11 사용자 유형 설정에 대한 지시사항은 PKCS #11 사용자 유형 설정에 대한 우수 사례를 참조하십시오.
세션
Cryptoki API를 사용하려면 토큰의 오브젝트 및 함수에 대한 액세스 권한을 얻을 수 있도록 애플리케이션에 토큰이 포함된 하나 이상의 세션이 열려 있어야 합니다. 세션은 애플리케이션과 토큰 간의 논리 연결을 제공합니다. 세션은 읽기/쓰기(R/W) 세션 또는 읽기 전용(R/O) 세션이 될 수 있습니다.
토큰의 개인용 오브젝트에 대한 액세스 권한을 얻으려면 일반 사용자가 로그인해야 하며 인증됩니다. 세션에 대한 자세한 내용은 PKCS #11 암호화 토큰 인터페이스 사용 안내서 를 참조하십시오.
키 오브젝트
키 오브젝트는 PKCS #11 애플리케이션에 상주하는 인메모리 키 저장소 또는 데이터베이스 지원 키 저장소에 저장됩니다.CKA_TOKEN 속성이 키 오브젝트에 대해 true
로 설정되는 경우 키 오브젝트는 데이터베이스 지원 키 저장소에 저장됩니다. 그렇지 않으면 키 오브젝트는 인메모리 키 저장소에 저장됩니다.
인메모리 키 저장소의 키 오브젝트는 마스터 키 순환 후 자동으로 순환되지 않습니다. PKCS #11 키 저장소가 서비스 인스턴스에서 사용 가능한 경우, 마스터 키 순환이 완료된 후 인메모리 키 저장소를 지우려면 모든 활성 PKCS #11 애플리케이션을 다시 시작해야 합니다.
다음 다이어그램에 표시된 대로 PKCS #11 키 오브젝트는 PKCS #11 오브젝트 클래스의 예입니다.
- 데이터: 애플리케이션으로 정의되는 데이터 오브젝트입니다.
- 인증서: 인증서 오브젝트는 인증서를 저장합니다.
- 키: 키 오브젝트는 암호화 키를 저장합니다.이 키는 공개 키, 개인 키 또는 시크릿 키가 될 수 있습니다. 키 유형마다 특정 메커니즘에 사용할 하위 유형이 있습니다.
- 공개 키: 키 쌍의 개인 키에 액세스할 수 있는 특정 수신인을 위해 작성된 메시지를 암호화하도록 모든 사용자가 사용하는 키 쌍의 공용 컴포넌트입니다. 공개 키는 개인 키로 작성된 서명을 확인하는 경우에도 사용됩니다.
- 개인 키: 메시지를 복호화하는 데 사용되는 키 쌍의 개인 컴포넌트입니다. 개인 키는 서명을 작성하는 경우에도 사용됩니다.
- 비밀 키: 비밀 키는 메시지를 대칭적으로 암호화하고 복호화하는 데 사용되는 생성된 비트 스트림입니다.
Cloud Identity and Access Management
IBM Cloud Identity and Access Management(IAM)는 PKCS #11 API를 구현하기 위해 사용자 인증 및 액세스 제어를 제공합니다.PKCS #11 라이브러리는 API 키를 사용하여 Cryptoki API 호출을 수행하기 위해 사용되는 베어러 토큰을 획득합니다.
PKCS #11의 이 구현은 API 키와 사용자의 PIN을 동일시합니다. 서비스 ID및 해당 API키를 설정하는 방법에 대한 자세한 정보는 SO 사용자, 일반 사용자 및 익명 사용자에 대한 서비스 ID 작성을 참조하십시오.
암호화 서비스
PKCS #11 라이브러리 초기화 프로세스의 일부로 PKCS #11 라이브러리에서 IBM Cloud까지 gRPC가 연결됩니다. gRPC 연결을 사용하는 경우 PKCS #11 라이브러리에서 원활하게 C_Encrypt
, C_Decrypt
, C_Sign
및 C_Verify
과(와) 같은 Cryptoki 함수를 호출할 수 있도록 해주며, 이
경우 하드웨어 보안 모듈(HSM)을 사용해야 합니다.
키 저장소
다음과 같은 두 가지 기본 유형의 키 저장소를 사용할 수 있습니다.
- 인메모리 키 저장소: 임시로 메모리에 키 저장소를 저장합니다. 인메모리 키 저장소에 저장되는 키 오브젝트는 세션 오브젝트라고도 합니다. 특정 세션의 세션 오브젝트는 해당 세션에 대한
C_CloseSession
함수를 호출할 때 영구 삭제됩니다. 모든 세션의 세션 오브젝트는C_Finalize
함수가 호출된 후 영구 삭제됩니다. - 데이터베이스 지원 키 저장소: 데이터베이스에 키 오브젝트를 저장합니다. 데이터베이스 지원 키 저장소에 저장되는 키 오브젝트는 토큰 오브젝트라고도 합니다.
sessionauth
매개변수가 사용으로 설정되고 키 저장소의 비밀번호가 구성된 경우 데이터베이스 지원 키 저장소가 암호화되고 인증됩니다. 기본적으로sessionauth
매개변수는 사용 안함으로 설정되어 있습니다. 서비스 인스턴스별로 최대 다섯 개의 인증된 키 저장소가 지원됩니다.sessionauth
매개변수를 사용으로 설정하여 키 저장소에 생성된 키를 암호화하거나 키를 사용하기 전에 해당 키를 복호화할 수 있습니다. 비밀번호는 6 - 8자가 될 수 있습니다.
키 저장소 비밀번호는 서비스 인스턴스에 저장되지 않습니다. 키 저장소 관리자는 비밀번호의 로컬 사본을 유지보수할 책임이 있습니다. 비밀번호가 유실된 경우 지원 팀에 문의하여 키 저장소를 재설정해야 합니다. 이 경우 키 저장소의 모든 데이터가 지워지게 됩니다.
인메모리 키 저장소와 데이터베이스 지원 키 저장소는 다음 유형의 키 저장소로 구성됩니다.
- 공용 키 저장소: 덜 민감하고 사용자 유형에 따라 액세스될 키를 저정합니다.
- 개인용 키 저장소: 민감한 데이터를 암호화하고 일반 사용자만 액세스할 키를 저장합니다.
사용자 유형 및 키 속성 설정에 따라 생성된 키는 다른 키 저장소에 저장됩니다. 다음 목록에는 키가 저장되는 방식의 기준이 요약되어 있습니다.
-
CKA_TOKEN 속성 값은 생성된 키가 인메모리 키 저장소에 저장될지 아니면 데이터베이스 지원 키 저장소에 저장될지를 결정합니다.
키를 데이터베이스 지원 키 저장소에 저장할 경우 키 또는 키 쌍 생성 템플리트에서 CKA_TOKEN을
TRUE
로 설정해야 합니다. PKCS #11 라이브러리 초기화 프로세스는 IBM Cloud와의 gRPC 연결을 설정하며, 이를 통해 데이터베이스 지원 키 저장소로(에서) 키 오브젝트를 쉽게 저장하고 검색할 수 있습니다. 기본적으로 CKA_TOKEN이FALSE
로 설정되면 키 오브젝트는 PKCS #11 애플리케이션의 프로세스 주소 공간 내 인메모리 키 저장소에 저장됩니다. -
CKA_PRIVATE 속성 값은 일반 사용자가 생성하는 키가 공용 키 저장소에 저장될지 아니면 개인용 키 저장소에 저장될지를 결정합니다.
기본적으로 사용자가 일반 사용자로 로그인하면 생성된 키는 CKA_PRIVATE이
FALSE
로 설정되는 경우를 제외하고 개인용 키 저장소에 저장됩니다. 사용자가 SO 사용자로 로그인되어 있거나 로그인되어 있지 않은 경우(익명 사용자로 알려짐) 생성된 키는 항상 공용 키 저장소에 저장됩니다. SO 사용자 또는 익명 사용자가 키 생성 템플리트에서 CKA_PRIVATE를TRUE
로 지정하는 경우 서버에서 오류가 리턴됩니다.비대칭 키 쌍의 경우 공용 및 개인용 키에 대해 각각 CKA_PRIVATE 속성을 설정해야 합니다. 즉, 키 쌍은 다른 키 저장소에 저장될 수 있습니다.
사용자 유형, 키 속성 및 키 저장소 간의 관계와 키 저장 방법에 대한 자세한 설명은 다음 표를 참조하십시오.
사용자 유형 | CKA_TOKEN | CKA_PRIVATE | 키의 키 저장소 | 공용 또는 개인용 |
---|---|---|---|---|
SO 사용자 | FALSE |
해당사항 없음 | 인메모리 키 저장소 | 공용 |
SO 사용자 | TRUE |
해당사항 없음 | 데이터베이스 지원 키 저장소 | 공용 |
익명 사용자 | FALSE |
해당사항 없음 | 인메모리 키 저장소 | 공용 |
익명 사용자 | TRUE |
해당사항 없음 | 데이터베이스 지원 키 저장소 | 공용 |
일반 사용자 | FALSE |
FALSE |
인메모리 키 저장소 | 공용 |
일반 사용자 | FALSE |
TRUE |
인메모리 키 저장소 | 개인용 |
일반 사용자 | TRUE |
FALSE |
데이터베이스 지원 키 저장소 | 공용 |
일반 사용자 | TRUE |
TRUE |
데이터베이스 지원 키 저장소 | 개인용 |
포스트 양자 암호화(post-quantum cryptography) 지원
PKCS #11 API를 사용하여 사후 퀀텀 암호화 조작을 수행할 수도 있습니다. 기존 암호는 클래식 컴퓨터가 해결하기 어려운 복잡한 수학 문제를 사용합니다. 하지만 컴퓨팅 기능을 이용하여 양자 컴퓨터는 해당 문제를 해결할 수 있습니다. 포스트 양자 암호화는 양자 컴퓨터의 암호 공격에 내성이 있는 것으로 간주됩니다. 일반적으로 비대칭 알고리즘을 사용하며 다중 접근법을 사용합니다.
PKCS #11 API는 사후 퀀텀 암호화를 위한 디리튬 알고리즘 을 제공합니다. 격자 기반 디지털 서명 방식이며 서명 생성 및 검증에 사용할 수 있습니다. 현재 High-Security Version of round 2 Di리튬 만 지원되며 C_SignUpdate
및 C_VerifyUpdate
조작에 사용할 수 없습니다.
Dilithium 알고리즘은 Crypto Express 7S(CEX7S)라고도 하는 IBM 4769 암호화 카드에서만 지원됩니다. CEX7S 암호화 카드가 사용되는 VPC(Virtual Private Cloud) 기반 지역에서 인스턴스를 작성하는 경우 PKCS #11 API를 사용하여 포스트 양자 암호화에 Dilithium 알고리즘을 사용할 수 있습니다. VPC 기반 지역 목록은 지역 및 위치를 참조하십시오.
PKCS #11에서의 Dilithium 알고리즘 지원에 대한 자세한 정보는 PKCS #11 API 참조를 확인하십시오. GitHub 샘플 저장소에서도 Di리튬 알고리즘 코드 예제를 찾을 수 있습니다.