이 주제에서는 비대칭 키를 기반으로 한 디지털 서명 생성 및 검증에 대한 정보를 제공합니다.
디지털 서명은 비대칭 키의 비공개 키 부분을 사용하여 생성됩니다. 서명은 동일한 비대칭 키의 공개 키 부분을 사용하여 검증됩니다.
시작하기 전에
디지털 서명을 만들 때는 키 용도가
ASYMMETRIC_SIGN
인 키를 사용해야 합니다. 키를 만들 때는ASYMMETRIC_SIGN
을 사용합니다.서명을 확인하려면 키를 만들 때 사용한 전체 알고리즘을 알아야 합니다. 아래의
openssl
명령어를 사용하는 명령줄 안내의 경우 이 정보를 해당 명령어에 전달해야 합니다.서명을 수행할 사용자 또는 서비스에 비대칭 키에 대한
cloudkms.cryptoKeyVersions.useToSign
권한을 부여합니다. Cloud Key Management Service의 권한은 권한 및 역할에서 확인할 수 있습니다.서명을 검증하려면 검증에 사용할 공개 키를 다운로드할 사용자 또는 서비스에 비대칭 키에 대한
cloudkms.cryptoKeyVersions.viewPublicKey
권한을 부여합니다.명령줄을 사용하려고 하지만 OpenSSL을 아직 설치하지 않았으면 설치합니다. Cloud Shell을 사용하는 경우에는 OpenSSL이 이미 설치되어 있습니다.
데이터와 다이제스트 비교
AsymmetricSign 요청에 제공된 입력은 data
필드 또는 digest
필드를 통해 전달될 수 있습니다. 두 필드를 동시에 지정할 수는 없습니다. 원시 알고리즘 및 Cloud 외부 키 관리자 키로 서명하는 것과 같이 데이터 필드가 필요한 몇 가지 알고리즘이 있습니다.
원시 알고리즘
RSA_SIGN_RAW_
프리픽스로 식별되는 '원시' 알고리즘은 DigestInfo로의 인코딩을 생략하는 PKCS #1 서명의 변형입니다. 이 변형은 다음과 같은 특징이 있습니다.
- 다이제스트는 서명될 메시지를 대상으로 계산됩니다.
- PKCS #1 패딩은 다이제스트에 직접 적용됩니다.
- 패딩된 다이제스트의 서명은 RSA 비공개 키를 사용하여 계산됩니다.
이러한 알고리즘을 사용하려면 다음 안내를 따르세요.
data
필드의 일부로 다이제스트 대신 원시 데이터를 제공해야 합니다.- 데이터의 길이 한도는 RSA 키 크기보다 11바이트 적습니다. 예를 들어, 2048비트 RSA 키가 있는 PKCS #1은 최대 245바이트에 서명할 수 있습니다.
cloudkms.expertRawPKCS1
역할을 적절한 사용자 또는 서비스에 부여합니다. Cloud Key Management Service의 권한은 권한 및 역할에서 확인할 수 있습니다.
다른 해시 알고리즘을 위한 ECDSA 지원
ECDSA 서명 알고리즘은 일반적인 형식을 가집니다.
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM의 값은 SHA256
, SHA384
또는 SHA512
입니다.
서명을 만들기 전에 해시가 수행되므로 이러한 서명 알고리즘을 Keccak과 같이 SHA가 아닌 다이제스트와 함께 사용할 수도 있습니다. Keccak 다이제스트를 사용하려면 Keccak 해시 값을 제공하고 동일한 길이의 SHA 다이제스트 알고리즘을 사용합니다. 예를 들어 EC_SIGN_P256_SHA256
알고리즘으로 요청에 KECCAK256
다이제스트를 사용할 수 있습니다.
서명 만들기
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
gcloud kms asymmetric-sign \ --version key-version \ --key key \ --keyring key-ring \ --location location \ --digest-algorithm digest-algorithm \ --input-file input-file \ --signature-file signature-file
key-version을 서명에 사용할 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. digest-algorithm을 사용할 알고리즘으로 바꿉니다. digest-algorithm을 생략하여 input-file을 서명할 Cloud KMS로 보냅니다. input-file 및 signature-file을 서명할 파일의 로컬 경로와 서명 파일을 대체합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help
플래그와 함께 명령어를 실행하세요.
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.asymmetricSign
메서드를 사용하여 서명을 수행합니다. 이 메서드의 응답에는 base64 인코딩 서명이 포함됩니다.
타원 곡선 서명 검증
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
공개 키 가져오기
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
key-version을 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. output-file를 로컬 시스템에 공개 키를 저장할 파일 경로로 바꿉니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help
플래그와 함께 명령어를 실행하세요.
서명 확인
서명을 검증하는 OpenSSL 명령어는 생성된 서명 유형에 따라 달라집니다. 예를 들어 OpenSSL을 사용하여 SHA-256 타원 곡선 서명을 검증하려면 -sha256
을 지정해야 합니다. SHA-384 타원 곡선 서명의 유효성을 검사하려면 -sha384
를 지정해야 합니다.
openssl dgst \ -sha256 \ -verify public-key-file \ -signature signature-file \ message-file
변수를 자체 값으로 바꿉니다.
public-key-file. 공개 키를 포함하는 파일의 경로입니다(예:
"./my-key.pub"
).signature-file. 확인할 서명을 포함하는 파일의 경로입니다(예:
"./my-data.sig"
).message-file. 메시지를 포함하는 파일의 경로입니다(예:
"./my-data.txt"
).
서명이 유효한 경우 명령은 문자열 Verified OK
를 출력합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 help
하위 명령어와 함께 명령어를 실행하세요.
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.getPublicKey 메서드를 사용하여 공개 키를 검색한 후 명령줄 예시에 있는 명령어를 사용하여 서명을 검증합니다.
RSA 서명 검증
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
공개 키 가져오기
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
key-version을 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. output-file를 로컬 시스템에 공개 키를 저장할 경로로 바꿉니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help
플래그와 함께 명령어를 실행하세요.
서명 확인
서명을 검증하는 OpenSSL 명령어는 생성된 서명 유형에 따라 달라집니다. 예를 들어 PSS 패딩으로 SHA-256 RSA 서명을 검증하려면 -sha256
및 -sigopt rsa_padding_mode:pss
를 지정해야 합니다. PSS 패딩으로 SHA-512 RSA 서명의 유효성을 검사하려면 -sha512
및 -sigopt
rsa_padding_mode:pss
를 지정해야 합니다.
openssl dgst \ -sha256 \ -sigopt rsa_padding_mode:pss \ -sigopt rsa_pss_saltlen:-1 \ -verify public-key-file \ -signature signature-file \ message-file
변수를 자체 값으로 바꿉니다.
public-key-file. 공개 키를 포함하는 파일의 경로입니다(예:
"./my-key.pub"
).signature-file. 확인할 서명을 포함하는 파일의 경로입니다(예:
"./my-data.sig"
).message-file. 메시지를 포함하는 파일의 경로입니다(예:
"./my-data.txt"
).
서명이 유효한 경우 명령은 문자열 Verified OK
를 출력합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 help
하위 명령어와 함께 명령어를 실행하세요.
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.getPublicKey
메서드를 사용하여 공개 키를 검색한 후 명령줄 예시에 있는 명령어를 사용하여 서명을 검증합니다.