이 주제에서는 RSA 키를 사용하여 비대칭 암호화를 위한 키를 만들고 사용하는 방법에 대한 정보를 제공합니다. 비대칭 키를 사용하여 서명을 만들고 검증하려면 디지털 서명 만들기 및 검증을 참조하세요. 암호화 및 복호화에 대칭 키를 사용하려면 데이터 암호화 및 복호화를 참조하세요.
비대칭 암호화는 비대칭 키의 공개 키 부분을 사용하고, 복호화는 키의 비공개 키 부분을 사용합니다. Cloud Key Management Service는 공개 키를 검색할 수 있는 기능과 공개 키로 암호화된 암호문을 복호화할 수 있는 기능을 제공합니다. Cloud KMS에서는 비공개 키에 직접 액세스할 수 없습니다.
시작하기 전에
이 주제에서는 명령줄에서 실행되는 예를 제공합니다. 예시를 간단히 사용하려면 Cloud Shell을 사용하세요. 암호화 예시는 Cloud Shell에 사전 설치된 OpenSSL을 사용합니다.
키 용도가
ASYMMETRIC_DECRYPT
인 비대칭 키를 만듭니다. 키 용도ASYMMETRIC_DECRYPT
를 지원하는 알고리즘을 확인하려면 비대칭 암호화 알고리즘을 참조하세요. 이 절차는ASYMMETRIC_SIGN
용도의 키로 수행할 수 없습니다.명령줄을 사용하려고 하지만 OpenSSL을 아직 설치하지 않았으면 설치합니다. Cloud Shell을 사용하는 경우에는 OpenSSL이 이미 설치되어 있습니다.
- macOS 사용자: macOS에 설치된 OpenSSL 버전은 이 주제에서 데이터를 복호화하는 데 사용되는 플래그를 지원하지 않습니다. macOS에서 이 단계를 수행하려면 Homebrew에서 OpenSSL을 설치하세요.
키 액세스 제어
공개 키를 검색할 사용자 또는 서비스에 비대칭 키에 대한
cloudkms.cryptoKeyVersions.viewPublicKey
권한을 부여합니다. 데이터를 암호화하는 데 공개 키가 필요합니다.공개 키로 암호화된 데이터를 복호화할 사용자나 서비스에 비대칭 키에 대한
cloudkms.cryptoKeyVersions.useToDecrypt
권한을 부여합니다.
권한 및 역할에서 Cloud KMS의 권한과 역할을 알아보세요.
데이터 암호화
비대칭 암호화 키를 사용하여 데이터를 암호화하려면 공개 키를 검색하고 이 공개 키를 사용해서 데이터를 암호화합니다.
gcloud
이 샘플은 로컬 시스템에 OpenSSL이 설치되어 있어야 합니다.
공개 키 다운로드
공개 키를 다운로드합니다.
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file public-key-path
key-version을 공개 키가 있는 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. public-key-path를 로컬 시스템에 공개 키를 저장할 위치로 바꿉니다.
데이터 암호화
방금 다운로드한 공개 키를 사용하여 데이터를 암호화하고 출력을 파일에 저장합니다.
openssl pkeyutl -in cleartext-data-input-file \ -encrypt \ -pubin \ -inkey public-key-path \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256 \ > encrypted-data-output-file
cleartext-data-input-file을 암호화할 파일 이름 및 경로로 바꿉니다.
public-key-path를 공개 키를 다운로드한 파일 이름 및 경로로 바꿉니다.
encrypted-data-output-file을 암호화된 데이터를 저장할 파일 이름 및 경로로 바꿉니다.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
데이터 복호화
Cloud KMS를 사용하여 복호화를 수행합니다.
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
gcloud kms asymmetric-decrypt \ --version key-version \ --key key \ --keyring key-ring \ --location location \ --ciphertext-file file-path-with-encrypted-data \ --plaintext-file file-path-to-store-plaintext
key-version을 키 버전으로 바꾸거나 --version
플래그를 생략하여 버전을 자동으로 인식합니다. key를 복호화에 사용할 키 이름으로 바꿉니다. key-ring을 키를 배치할 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. file-path-with-encrypted-data 및 file-path-to-store-plaintext를 암호화된 데이터를 읽고 복호화된 출력을 저장할 로컬 파일 경로로 바꿉니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help
플래그와 함께 명령어를 실행하세요.
복호화된 파일의 콘텐츠를 표시하려면 편집기 또는 터미널에서 엽니다. 다음은 cat
명령어를 사용하여 파일 콘텐츠를 보여주는 예시입니다.
cat ./my-file.txt
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
API
이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.
CryptoKeyVersions.asymmetricDecrypt
메서드를 사용합니다.
문제 해결
incorrect key purpose: ASYMMETRIC_SIGN
키 용도가 ASYMMETRIC_DECRYPT
인 키로만 데이터를 복호화할 수 있습니다.
macOS에서 복호화하는 경우 invalid parameter
macOS에 설치된 OpenSSL 버전은 이 주제에서 데이터 복호화에 사용되는 플래그를 지원하지 않습니다. macOS에서 이 단계를 수행하려면 Homebrew에서 OpenSSL을 설치하세요.
data too large for key size
RSA 복호화의 최대 페이로드 크기는 키 크기와 패딩 알고리즘에 따라 다릅니다. Cloud KMS에서 사용하는 모든 RSA 암호화 형식은 RFC 2437에서 표준화된 OAEP를 사용합니다. 다음 알고리즘은 다음과 같은 최대 페이로드 크기(maxMLen
, 바이트)를 지원합니다.
알고리즘 | 매개변수 | 최대 메시지 길이 |
---|---|---|
RSA_DECRYPT_OAEP_2048_SHA256 | k = 256, hLen = 32, | maxMLen = 190 |
RSA_DECRYPT_OAEP_3072_SHA256 | k = 384, hLen = 32, | maxMLen = 318 |
RSA_DECRYPT_OAEP_4096_SHA256 | k = 512, hLen = 32, | maxMLen = 446 |
RSA_DECRYPT_OAEP_4096_SHA512 | k = 512, hLen = 64, | maxMLen = 382 |
이러한 한도보다 큰 다양한 길이의 메시지에는 비대칭 암호화를 사용하지 않는 것이 좋습니다. 대신 하이브리드 암호화를 사용해보세요. Tink는 이 접근 방식을 사용하는 암호화 라이브러리입니다.