양자 내성 키 가져오기

이 가이드에서는 양자 내성 가져오기 방법을 사용하여 암호화 키를 Cloud Key Management Service로 새 키 버전으로 가져오는 방법을 보여줍니다. 이 접근 방식은 전송 중인 키를 향후 양자 컴퓨터의 '지금 수집, 나중에 복호화' (HNDL) 공격으로부터 보호하는 데 도움이 됩니다.

양자 내성 키 가져오기는 전송 중에 키를 보호하기 위해 키 캡슐화 메커니즘 (KEM) 및 하이브리드 공개 키 암호화 (HPKE)를 비롯한 표준 양자 내성 암호화(PQC) 도구를 사용합니다.

소프트웨어 지원 키 (SOFTWARE 보호 수준)의 경우 양자 내성 키 가져오기가 지원됩니다.

시작하기 전에

키를 가져오기 전에 프로젝트, 로컬 시스템, 키 자료 자체를 준비해야 합니다.

프로젝트 준비

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the required API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. Google Cloud CLI를 설치합니다.

  6. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  7. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the required API.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  11. Google Cloud CLI를 설치합니다.

  12. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  13. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init

필요한 역할

키를 가져오는 데 필요한 권한을 얻으려면 관리자에게 키링에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

로컬 시스템 준비

키 캡슐화 메커니즘 (KEM) 및 하이브리드 공개 키 암호화 (HPKE)를 비롯한 양자 내성 암호화 (PQC) 도구를 지원하는 암호화 라이브러리가 로컬 시스템에 있어야 합니다. 다음 기능을 지원하는 Tink, OpenSSL 또는 기타 암호화 라이브러리를 사용할 수 있습니다.

  • 하이브리드 공개 키 암호화 (HPKE)
  • 다음 KEM 알고리즘 중 하나:
    • ML-KEM-768
    • ML-KEM-1024
    • X-WING (ML-KEM-768X25519의 하이브리드)
  • HKDF-SHA256 키 파생 함수 (KDF)
  • AES-256-GCM 알고리즘을 사용하는 연관 데이터로 인증된 암호화 (AEAD)

키 준비

키의 알고리즘 및 길이가 지원되는지 확인합니다. 키의 모든 버전은 동일한 보호 수준(SOFTWARE)을 가져야 합니다.

대상 키 및 키링 만들기

키 자료를 가져오면 기존 키의 새 키 버전이 됩니다. 이 키를 대상 키라고 합니다. 키 자료를 가져오려면 먼저 대상 키링과 대상 키가 있어야 합니다.

Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 새 키링에 빈 소프트웨어 지원 키를 만들려면 다음 단계를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 키 관리 페이지로 이동합니다.

    Key Management Service로 이동

  2. 키링 만들기를 클릭합니다.

  3. 키링 이름 필드에 키링의 이름을 입력합니다.

  4. 위치 유형에서 위치 유형과 위치를 선택합니다.

  5. 만들기를 클릭합니다. 키 만들기 페이지가 열립니다.

  6. 키 이름 필드에 키 이름을 입력합니다.

  7. 보호 수준에서 소프트웨어를 선택합니다.

  8. 키 자료에서 가져온 키를 선택한 다음 계속을 클릭합니다. 이렇게 하면 초기 키 버전이 생성되지 않습니다.

  9. 키의 용도알고리즘을 설정한 다음 계속을 클릭합니다.

  10. 선택사항: 이 키에 가져온 키 버전만 포함하려면 키 버전을 가져오기만 하도록 제한을 선택합니다. 이렇게 하면 Cloud KMS에서 실수로 새 키 버전을 만드는 것을 방지할 수 있습니다.

  11. 선택사항: 가져온 키의 경우 기본적으로 자동 순환이 중지됩니다. 자동 순환을 사용 설정하려면 키 순환 기간 필드에서 값을 선택합니다.

    자동 순환을 사용 설정하면 Cloud KMS에 새로운 키 버전이 생성되고 순환 후 가져온 키 버전은 더 이상 기본 키 버전이 되지 않습니다.

  12. 만들기를 클릭합니다.

gcloud

명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.

  1. 대상 키링을 만듭니다. 사용하려는 보호 수준과 호환되는 위치를 선택합니다. 지원되는 위치에 대한 자세한 내용은 Cloud KMS 위치를 참고하세요.

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    키링을 만드는 방법에 대해 자세히 알아보세요.

  2. --skip-initial-version-creation 플래그와 함께 kms keys create 명령어를 사용하여 타겟 키를 만듭니다. 이렇게 하면 가져온 키 자료가 버전 1인 초기 키 버전이 없는 키가 생성됩니다. --import-only 플래그를 사용하여 Cloud KMS가 새 키 버전의 키 자료를 생성하지 못하도록 합니다. 이 플래그가 설정되면 이 키의 새 키 버전을 가져와야 합니다. --import-only로 생성된 키는 수동으로 순환해야 합니다.

    gcloud kms keys create KEY_NAME \
      --location LOCATION \
      --keyring KEY_RING \
      --purpose PURPOSE \
      --protection-level SOFTWARE \
      --skip-initial-version-creation \
      --import-only
    

    다음을 바꿉니다.

    • KEY_NAME: 키에 사용할 이름입니다.
    • LOCATION: 키링의 위치입니다.
    • KEY_RING: 키를 만들 키링입니다.
    • PURPOSE: 키에 사용할 용도입니다.

API

이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.

  1. 새 키링을 만듭니다.

    curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings?keyRingId=KEY_RING" \
        --request "POST" \
        --header "authorization: Bearer TOKEN" \
        --header "content-type: application/json" \
        --header "x-goog-user-project: PROJECT_ID" \
        --data "{}"
    

    자세한 내용은 KeyRing.create API 참고 리소스를 참조하세요.

  2. 가져오기 전용 빈 키를 만듭니다.

    curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys?cryptoKeyId=KEY_NAME&skipInitialVersionCreation=true" \
        --request "POST" \
        --header "authorization: Bearer TOKEN" \
        --header "content-type: application/json" \
        --header "x-goog-user-project: PROJECT_ID" \
        --data "{"purpose":"PURPOSE", "importOnly": "true", "versionTemplate":{"protectionLevel":"PROTECTION_LEVEL","algorithm":"ALGORITHM"}}"
    

    자세한 내용은 CryptoKey.create API 참고 리소스를 참조하세요.

이제 키링과 키가 있지만 키에 키 자료와 버전이 없고 활성 상태가 아닙니다. 다음으로 가져오기 작업을 만듭니다.

가져오기 작업 만들기

가져오기 작업은 보호 수준과 가져오기 방법을 비롯하여 가져오는 키의 특성을 정의합니다.

양자 내성 키 가져오기는 SOFTWARE 보호 수준에서만 지원됩니다. 다음 양자 내성 가져오기 방법 중 하나를 선택합니다.

  • HPKE_KEM_XWING_HKDF_SHA256_AES_256_GCM
  • HPKE_KEM_ML_KEM_768_HKDF_SHA256_AES_256_GCM
  • HPKE_KEM_ML_KEM_1024_HKDF_SHA256_AES_256_GCM

gcloud

다음 명령어를 실행하여 양자 내성 가져오기 메서드를 사용하여 가져오기 작업을 만듭니다.

gcloud kms import-jobs create IMPORT_JOB \
    --location LOCATION \
    --keyring KEY_RING \
    --import-method IMPORT_METHOD \
    --protection-level software

다음을 바꿉니다.

  • IMPORT_JOB: 가져오기 작업에 사용할 고유한 이름입니다.
  • LOCATION: 타겟 키를 만든 키링의 위치입니다.
  • KEY_RING: 타겟 키를 만든 키링의 이름입니다.
  • IMPORT_METHOD: 사용할 양자 내성 가져오기 메서드입니다(예: hpke-kem-xwing-hkdf-sha256-aes-256-gcm).

REST

keyRings.importJobs.create 메서드를 호출합니다.

curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/importJobs?import_job_id=IMPORT_JOB" \
    --request "POST" \
    --header "authorization: Bearer TOKEN" \
    --header "content-type: application/json" \
    --data '{"import_method": "IMPORT_METHOD", "protection_level": "SOFTWARE"}'

다음을 바꿉니다.

  • PROJECT_ID: Cloud KMS 프로젝트의 식별자입니다.
  • LOCATION: 타겟 키를 만든 키링의 위치입니다.
  • KEY_RING: 타겟 키를 만든 키링의 이름입니다.
  • IMPORT_JOB: 가져오기 작업에 사용할 고유한 이름입니다.
  • TOKEN: 요청을 인증하는 토큰입니다.
  • IMPORT_METHOD: 사용할 양자 내성 가져오기 메서드입니다(예: HPKE_KEM_XWING_HKDF_SHA256_AES_256_GCM).

가져오기 작업 상태 확인

가져오기 작업의 초기 상태는 PENDING_GENERATION입니다. 상태가 ACTIVE이면 이를 사용하여 키를 가져올 수 있습니다.

가져오기 작업은 3일 후에 만료됩니다. 가져오기 작업이 만료된 경우 새 작업을 만들어야 합니다.

Google Cloud CLI,Google Cloud 콘솔 또는 Cloud Key Management Service API를 사용하여 가져오기 작업의 상태를 확인할 수 있습니다.

콘솔

  1. Google Cloud 콘솔에서 키 관리 페이지로 이동합니다.

    키 관리 페이지로 이동

  2. 가져오기 작업이 있는 키링의 이름을 클릭합니다.

  3. 페이지 상단에 있는 가져오기 작업 탭을 클릭합니다.

  4. 상태가 가져오기 작업 이름 옆에 있는 상태 아래에 표시됩니다.

gcloud

명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.

가져오기 작업이 활성 상태이면 이를 사용하여 키를 가져올 수 있습니다. 몇 분 정도 걸릴 수 있습니다. 이 명령어를 사용하여 가져오기 작업이 활성 상태인지 확인합니다. 가져오기 작업을 만든 위치와 키링을 사용합니다.

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEY_RING \
  --format="value(state)"

출력은 다음과 비슷합니다.

state: ACTIVE

Go

이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.

import (
	"context"
	"fmt"
	"io"

	kms "cloud.google.com/go/kms/apiv1"
	"cloud.google.com/go/kms/apiv1/kmspb"
)

// checkStateImportJob checks the state of an ImportJob in KMS.
func checkStateImportJob(w io.Writer, name string) error {
	// name := "projects/PROJECT_ID/locations/global/keyRings/my-key-ring/importJobs/my-import-job"

	// Create the client.
	ctx := context.Background()
	client, err := kms.NewKeyManagementClient(ctx)
	if