원시 대칭 암호화

이 주제에서는 다음 원시 대칭 키 작업을 수행하는 방법을 설명합니다.

  • 로컬에서 또는 Cloud KMS를 사용하여 텍스트 또는 바이너리 일반 텍스트 콘텐츠를 암호화합니다.
  • 로컬로 또는 Cloud KMS를 사용하여 암호문을 복호화합니다.

일반(비원시) 대칭 키 작업을 수행하려면 대칭 키로 데이터 암호화 및 복호화를 참조하세요.

원시 대칭 암호화를 사용하면 온프레미스에서 또는 Cloud KMS를 사용하여 데이터를 암호화 및 복호화할 수 있으며 여러 라이브러리와 서비스 제공업체 간에 암호화된 데이터를 먼저 복호화하지 않고도 이동할 수 있습니다. 이 기능은 작업 시점에 키에 액세스할 수 있는지에 따라 달라집니다. Google Cloud 외부에서 암호문을 사용하려면 Cloud KMS에서 생성된 키를 내보낼 수 없으므로 가져온 키를 사용해야 합니다. 이러한 암호화 알고리즘은 표준 복호화 서비스에서 복호화할 수 있는 표준 암호문을 생성합니다. Google에서는 다음과 같은 원시 대칭 암호화 알고리즘을 지원합니다.

  • AES-128-GCM
  • AES-256-GCM
  • AES-128-CBC
  • AES-256-CBC
  • AES-128-CTR
  • AES-256-CTR

원시 암호화 알고리즘에 대한 다음 사항에 유의하세요.

  • AES-GCM은 사용이 권장되는 암호화 알고리즘으로서 추가 인증 데이터(AAD)를 기반으로 인증을 제공하고 인증 태그를 생성합니다. AES-GCM 알고리즘을 사용하여 암호화된 데이터는 제공된 AAD가 없으면 복호화할 수 없습니다.

  • AES-CBC는 일반 텍스트의 크기가 블록 크기의 배수 (16바이트)여야 합니다. 일반 텍스트가 블록 크기의 배수가 아니면 일반 텍스트를 암호화하기 전에 패딩하세요. 그렇지 않으면 작업이 실패하고 문제가 발생했음을 나타내는 오류가 표시됩니다.

  • AES-CBCAES-CTR은 인증된 암호화 스키마가 아니므로 실수로 인한 오용 위험이 커집니다. 기존 및 상호 운용성 요구사항을 지원하기 위해 제공되며 주의해서 사용해야 합니다. 일반적인 오용을 방지하려면 이러한 암호화 알고리즘을 사용하려면 다음 IAM 권한이 필요합니다.

    • AES-CBCcloudkms.cryptoKeyVersions.manageRawAesCbcKeys
    • AES-CTRcloudkms.cryptoKeyVersions.manageRawAesCtrKeys

필요한 역할

원시 암호화를 사용하는 데 필요한 권한을 얻으려면 관리자에게 키에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

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

인증되지 않은 원시 암호화 알고리즘의 추가 역할

  • AES-CBC 키 사용: Cloud KMS 전문가 원시 AES-CBC 키 관리자(roles/cloudkms.expertRawAesCbc)
  • AES-CTR 키 사용: Cloud KMS 전문가 원시 AES-CTR 키 관리자(roles/cloudkms.expertRawAesCtr)

시작하기 전에

  • 앞서 언급한 원시 대칭 암호화 권한을 의도한 주 구성원에게 부여합니다.
  • 키링 만들기에 설명된 대로 키링을 만듭니다.
  • 키 만들기키 가져오기에 설명된 대로 원시 대칭 암호화 키를 만들고 가져옵니다.

암호화

gcloud

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

gcloud kms raw-encrypt \
    --location LOCATION \
    --keyring KEY_RING \
    --key KEY_NAME \
    --version KEY_VERSION \
    --plaintext-file INPUT_FILE_PATH \
    --ciphertext-file OUTPUT_FILE_PATH

다음을 바꿉니다.

  • LOCATION: 키링의 Cloud KMS 위치입니다.

  • KEY_RING: 키가 포함된 키링의 이름입니다.

  • KEY_NAME: 암호화에 사용할 키의 이름입니다.

  • KEY_VERSION: 암호화에 사용할 키 버전의 ID입니다.

  • INPUT_FILE_PATH: 일반 텍스트 데이터를 읽기 위한 로컬 파일 경로입니다.

  • OUTPUT_FILE_PATH: 암호화된 출력을 저장할 로컬 파일 경로입니다.

모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.

API

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

JSON 및 REST API를 사용하는 경우 콘텐츠를 base64로 인코딩해야 Cloud KMS에서 암호화할 수 있습니다.

rawEncrypt 메서드를 사용하여 일반 텍스트 데이터를 암호화합니다.

curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawEncrypt" \
  --request "POST" \
  --header "authorization: Bearer TOKEN" \
  --header "content-type: application/json" \
  --data '{"plaintext": "BASE64_ENCODED_INPUT", "additionalAuthenticatedData": "BASE64_ENCODED_AAD"}'

다음을 바꿉니다.

  • PROJECT_ID: 키링이 포함된 프로젝트의 ID입니다.
  • LOCATION: 키링의 Cloud KMS 위치입니다.
  • KEY_RING: 키가 포함된 키링의 이름입니다.
  • KEY_NAME: 암호화에 사용할 키의 이름입니다.
  • KEY_VERSION: 암호화에 사용할 키 버전의 ID입니다.
  • BASE64_ENCODED_INPUT: 암호화하려는 base64로 인코딩된 일반 텍스트 데이터입니다.
  • BASE64_ENCODED_AAD: 무결성 및 진위성 보장을 제공하기 위해 사용되는 base64로 인코딩된 추가 인증 데이터입니다. 이 필드는 AES-GCM 알고리즘에만 적용됩니다.

암호화된 암호문과 base64 인코딩 문자열로 된 연결된 초기화 벡터를 포함하는 JSON 객체가 출력으로 반환됩니다.

복호화

gcloud

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

gcloud kms raw-decrypt \
    --location LOCATION \
    --keyring KEY_RING \
    --key KEY_NAME \
    --version KEY_VERSION \
    --ciphertext-file INPUT_FILE_PATH \
    --plaintext-file OUTPUT_FILE_PATH

다음을 바꿉니다.

  • LOCATION: 키링의 Cloud KMS 위치입니다.

  • KEY_RING: 키가 포함된 키링의 이름입니다.

  • KEY_NAME: 암호화에 사용할 키의 이름입니다.

  • KEY_VERSION: 암호화에 사용할 키 버전의 ID입니다.

  • INPUT_FILE_PATH: 복호화하려는 암호문의 로컬 파일 경로입니다.

  • OUTPUT_FILE_PATH: 복호화된 일반 텍스트를 저장할 로컬 파일 경로입니다.

모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.

API

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

REST API를 사용하는 경우 콘텐츠를 base64로 인코딩해야 Cloud KMS에서 복호화할 수 있습니다.

암호화된 데이터를 복호화하려면 rawDecrypt 메서드를 사용합니다.

curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION:rawDecrypt" \
  --request "POST" \
  --header "authorization: Bearer TOKEN" \
  --header "content-type: application/json" \
  --data '{"ciphertext": "BASE64_ENCODED_DATA", "additionalAuthenticatedData": "BASE64_ENCODED_AAD", "initializationVector": "BASE64_ENCODED_IV"}'

다음을 바꿉니다.

  • PROJECT_ID: 키링이 포함된 프로젝트의 ID입니다.
  • LOCATION: 키링의 Cloud KMS 위치입니다.
  • KEY_RING: 키가 포함된 키링의 이름입니다.
  • KEY_NAME: 복호화에 사용할 키의 이름입니다.
  • KEY_VERSION: 복호화에 사용할 키 버전의 ID입니다.
  • BASE64_ENCODED_DATA: 복호화하려는 base64로 인코딩된 암호문입니다.
  • BASE64_ENCODED_AAD: 데이터가 암호화될 때 사용된 base64로 인코딩된 추가 인증 데이터입니다. 이 필드는 AES-GCM 알고리즘에만 적용됩니다.
  • BASE64_ENCODED_IV: 데이터가 암호화될 때 사용된 base64로 인코딩된 초기화 벡터입니다.

base64로 인코딩된 문자열로 된 복호화된 일반 텍스트를 포함하는 JSON 객체가 출력으로 반환됩니다.

다음 단계