이 주제에서는 다음 원시 대칭 키 작업을 수행하는 방법을 설명합니다.
- 로컬에서 또는 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
: 암호화에 사용할 키 버전의 IDINPUT_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
: 키링이 포함된 프로젝트의 IDLOCATION
: 키링의 Cloud KMS 위치KEY_RING
: 키가 포함된 키링의 이름KEY_NAME
: 암호화에 사용할 키의 이름KEY_VERSION
: 암호화에 사용할 키 버전의 IDBASE64_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
: 암호화에 사용할 키 버전의 IDINPUT_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
: 키링이 포함된 프로젝트의 IDLOCATION
: 키링의 Cloud KMS 위치KEY_RING
: 키가 포함된 키링의 이름KEY_NAME
: 복호화에 사용할 키의 이름KEY_VERSION
: 복호화에 사용할 키 버전의 IDBASE64_ENCODED_DATA
: 복호화하려는 base64 인코딩 암호문BASE64_ENCODED_AAD
: 데이터가 암호화될 때 사용된 base64로 인코딩된 추가 인증 데이터. 이 필드는AES-GCM
알고리즘에만 적용됩니다.BASE64_ENCODED_IV
: 데이터가 암호화될 때 사용된 base64로 인코딩된 초기화 벡터
base64로 인코딩된 문자열로 된 복호화된 일반 텍스트를 포함하는 JSON 객체가 출력으로 반환됩니다.
다음 단계
- 키 버전 가져오기 자세히 알아보기
- 봉투 암호화 자세히 알아보기
- Cloud KMS Codelab으로 데이터 암호화 및 복호화 사용해 보기