이 주제에서는 다음 원시 대칭 키 작업을 수행하는 방법을 설명합니다.
- 로컬에서 또는 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-CBC
및AES-CTR
은 인증된 암호화 스키마가 아니므로 실수로 인한 오용 위험이 커집니다. 기존 및 상호 운용성 요구사항을 지원하기 위해 제공되며 주의해서 사용해야 합니다. 일반적인 오용을 방지하려면 이러한 암호화 알고리즘을 사용하려면 다음 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으로 데이터 암호화 및 복호화 사용해 보기