이 주제에서는 다음 원시 대칭 키 작업을 수행하는 방법을 설명합니다.
- 로컬 또는 Cloud KMS를 사용하여 텍스트 또는 바이너리 일반 텍스트 콘텐츠를 암호화합니다.
- 로컬 또는 Cloud KMS를 사용하여 암호문을 복호화합니다.
일반(비원시) 대칭 키 작업을 수행하려면 대칭 키로 데이터 암호화 및 복호화를 참조하세요.
원시 대칭 암호화를 사용하면 온프레미스에서 또는 Cloud KMS를 사용하여 데이터를 암호화 및 복호화할 수 있으며 여러 라이브러리와 서비스 제공업체 간에 암호화된 데이터를 먼저 복호화하지 않고도 이동할 수 있습니다. 이 기능은 작업 시점에 키에 액세스할 수 있는지에 따라 달라집니다. Google Cloud외부에서 암호문을 사용하려면 가져온 키를 사용해야 합니다. Cloud KMS에서 생성된 키는 내보낼 수 없기 때문입니다. 이러한 암호화 알고리즘은 표준 복호화 서비스로 복호화할 수 있는 표준 암호문을 생성합니다. 다음과 같은 원시 대칭 암호화 알고리즘이 지원됩니다.
- 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-CBC및- AES-CTR은 인증된 암호화 스키마가 아니므로 실수로 인한 오용 위험이 커집니다. 이러한 API는 기존 및 상호 운용성 요구사항을 지원하기 위해 제공되며 주의해서 사용해야 합니다. 무심코 오용하는 것을 방지하기 위해 이러한 암호화 알고리즘을 사용하려면 다음 IAM 권한이 필요합니다.- AES-CBC의- cloudkms.cryptoKeyVersions.manageRawAesCbcKeys
- AES-CTR의- cloudkms.cryptoKeyVersions.manageRawAesCtrKeys
 
필요한 역할
원시 암호화를 사용하는 데 필요한 권한을 얻으려면 관리자에게 키에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- 
            암호화만 필요한 경우:
              
  
  
    
      Cloud KMS CryptoKey 암호화  (roles/cloudkms.cryptoKeyEncrypter)
- 
            복호화만 필요한 경우:
              
  
  
    
      Cloud KMS CryptoKey 복호화  (roles/cloudkms.cryptoKeyDecrypter)
- 
            암호화 및 복호화:
              
  
  
    
      Cloud KMS CryptoKey 암호화/복호화  (roles/cloudkms.cryptoKeyEncrypterDecrypter)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
인증되지 않은 원시 암호화 알고리즘의 추가 역할
- 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 객체가 출력으로 반환됩니다.
다음 단계
- 키 버전 가져오기 자세히 알아보기
- 봉투 암호화 자세히 알아보기
- Cloud KMS Codelab으로 데이터 암호화 및 복호화 사용해 보기