En este tema, se proporciona información sobre cómo crear y validar firmas digitales con base en claves asimétricas.
Una firma digital se crea usando la porción de la clave privada de una clave asimétrica. La firma se valida con la porción de la clave pública de la misma clave asimétrica.
Antes de comenzar
Cuando crees firmas digitales, debes usar una clave que tenga el propósito de clave de
ASYMMETRIC_SIGN
. Cuando crees la clave, usaASYMMETRIC_SIGN
.Para validar una firma, necesitas conocer el algoritmo completo que se usó cuando creaste la clave. Para obtener instrucciones sobre la línea de comandos que está a continuación y que usa el comando
openssl
, debes pasar esta información a esos comandos.Otorga el permiso
cloudkms.cryptoKeyVersions.useToSign
sobre la clave asimétrica al usuario o servicio que realizará la firma. Puedes obtener información sobre los permisos de Cloud Key Management Service en Permisos y funciones.Si vas a validar una firma, otorga el permiso
cloudkms.cryptoKeyVersions.viewPublicKey
sobre la clave asimétrica al usuario o servicio que descargará la clave pública para usarla en la validación.Si vas a usar la línea de comandos, asegúrate de tener instalado OpenSSL. Si usas Cloud Shell, OpenSSL ya está instalado.
Datos en comparación con el resumen
La entrada proporcionada para las solicitudes de AsymmetricSign se puede pasar a través del campo data
o del campo digest
. No se pueden especificar ambos campos al mismo tiempo. Hay algunos algoritmos que requieren el campo de datos, como los algoritmos sin procesar y la firma con una clave de Cloud External Key Manager.
Algoritmos sin procesar
Los algoritmos "sin procesar", identificados por el prefijo RSA_SIGN_RAW_
, son una variante de la firma PKCS #1 que omite la codificación en un DigestInfo. En la variante, haz lo siguiente:
- Se calcula un resumen sobre el mensaje que se firmará.
- El padding PKCS #1 se aplica directamente al resumen.
- Se calcula una firma del resumen con padding, con la clave privada RSA.
Para usar estos algoritmos, sigue estos pasos:
- Los datos sin procesar deben proporcionarse (en lugar de un resumen) como parte del campo
data
. - Los datos tienen un límite de longitud de 11 bytes menos que el tamaño de la clave RSA. Por ejemplo, PKCS #1 con una clave RSA de 2,048 bits puede firmar como máximo 245 bytes.
- Otorga el rol
cloudkms.expertRawPKCS1
al usuario o servicio adecuado. Puedes obtener información sobre los permisos de Cloud Key Management Service en Permisos y funciones.
Compatibilidad con ECDSA para otros algoritmos de hash
Nuestros algoritmos de firma ECDSA tienen el siguiente formato general:
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM tiene el valor SHA256
, SHA384
o SHA512
.
Debido a que el hash se realiza antes de crear la firma, estos algoritmos de firma también se pueden usar con otros resúmenes que no sean SHA, como Keccak. Para usar un resumen Keccak, proporciona un valor de hash Keccak y usa el algoritmo de resumen SHA con la misma longitud. Por ejemplo, puedes usar un resumen KECCAK256
en una solicitud con el algoritmo EC_SIGN_P256_SHA256
.
Crea una firma
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de 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
Reemplaza key-version por la versión de la clave que se usará para la firma. Reemplaza key por el nombre de la clave. Reemplaza key-ring por el nombre del llavero de claves en el que se encuentra la clave. Reemplaza location por la ubicación de Cloud KMS del llavero de claves. Reemplaza digest-algorithm por el algoritmo que se usará. Omite digest-algorithm para enviar input-file a Cloud KMS para que lo firme. Reemplaza input-file y signature-file por las rutas locales para que el archivo se firme y el archivo de firma.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con la marca --help
.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# e instala el SDK de C# para Cloud KMS.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
PHP
Para ejecutar este código, primero obtén información sobre cómo usar PHP en Google Cloud y, luego, instala el SDK de PHP para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
Ruby
Para ejecutar este código, primero configura un entorno de desarrollo de Ruby y, luego, instala el SDK de Ruby para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Usa el método CryptoKeyVersions.asymmetricSign
para realizar la firma. La respuesta de este método contiene la firma codificada en base64.
Valida una firma de curva elíptica
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Obtén la clave pública
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
Reemplaza key-version por la versión de clave. Reemplaza key por el nombre de la clave. Reemplaza key-ring por el nombre del llavero de claves en el que se encuentra la clave. Reemplaza location por la ubicación de Cloud KMS para el llavero de claves. Reemplaza output-file por la ruta del archivo para guardar la clave pública en el sistema local.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con la marca --help
.
Verifica la firma
Los comandos de OpenSSL para validar la firma dependen de qué tipo de firma se creó. Por ejemplo, para validar una firma de curva elíptica SHA-256 con OpenSSL, debes especificar -sha256
. Para validar una firma de curva elíptica SHA-384, debes especificar -sha384
.
openssl dgst \ -sha256 \ -verify public-key-file \ -signature signature-file \ message-file
Reemplaza las variables con tus propios valores:
public-key-file. Ruta de acceso a un archivo que contiene la clave pública (p. ej.,
"./my-key.pub"
).signature-file. Ruta de acceso a un archivo que contiene la firma que se desea verificar (p. ej.,
"./my-data.sig"
).message-file. Ruta de acceso a un archivo que contiene el mensaje (p. ej.,
"./my-data.txt"
).
Si la firma es válida, el comando genera la string Verified OK
.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con el subcomando help
.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# e instala el SDK de C# para Cloud KMS.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
PHP
Para ejecutar este código, primero obtén información sobre cómo usar PHP en Google Cloud y, luego, instala el SDK de PHP para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
Ruby
Para ejecutar este código, primero configura un entorno de desarrollo de Ruby y, luego, instala el SDK de Ruby para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Usa el método CryptoKeyVersions.getPublicKey a fin de recuperar la clave pública y, luego, usa los comandos que se muestran para el ejemplo de la línea de comandos a fin de validar la firma.
Valida una firma de RSA
gcloud
Para usar Cloud KMS en la línea de comandos, primero instala o actualiza a la versión más reciente de Google Cloud CLI.
Obtén la clave pública
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
Reemplaza key-version por la versión de clave. Reemplaza key por el nombre de la clave. Reemplaza key-ring por el nombre del llavero de claves en el que se encuentra la clave. Reemplaza location por la ubicación de Cloud KMS para el llavero de claves. Reemplaza output-file por la ruta para guardar la clave pública en el sistema local.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con la marca --help
.
Verifica la firma
Los comandos de OpenSSL para validar la firma dependen de qué tipo de firma se creó. Por ejemplo, para validar una firma RSA SHA-256 con relleno de PSS, debes especificar -sha256
y -sigopt rsa_padding_mode:pss
. Para validar una firma RSA SHA-512 con el relleno de PSS, debes especificar -sha512
y -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
Reemplaza las variables con tus propios valores:
public-key-file. Ruta de acceso a un archivo que contiene la clave pública (p. ej.,
"./my-key.pub"
).signature-file. Ruta de acceso a un archivo que contiene la firma que se desea verificar (p. ej.,
"./my-data.sig"
).message-file. Ruta de acceso a un archivo que contiene el mensaje (p. ej.,
"./my-data.txt"
).
Si la firma es válida, el comando genera la string Verified OK
.
Para obtener información sobre todas las marcas y los valores posibles, ejecuta el comando con el subcomando help
.
C#
Para ejecutar este código, primero configura un entorno de desarrollo de C# e instala el SDK de C# para Cloud KMS.
Go
Para ejecutar este código, primero configura un entorno de desarrollo de Go y, luego, instala el SDK de Go para Cloud KMS.
Java
Para ejecutar este código, primero configura un entorno de desarrollo de Java y, luego, instala el SDK de Java para Cloud KMS.
Node.js
Para ejecutar este código, primero configura un entorno de desarrollo de Node.js y, luego, instala el SDK de Node.js para Cloud KMS.
PHP
Para ejecutar este código, primero obtén información sobre cómo usar PHP en Google Cloud y, luego, instala el SDK de PHP para Cloud KMS.
Python
Para ejecutar este código, primero configura un entorno de desarrollo de Python y, luego, instala el SDK de Python para Cloud KMS.
Ruby
Para ejecutar este código, primero configura un entorno de desarrollo de Ruby y, luego, instala el SDK de Ruby para Cloud KMS.
API
En estos ejemplos, se usa curl como un cliente HTTP para demostrar el uso de la API. Para obtener más información sobre el control de acceso, consulta Accede a la API de Cloud KMS.
Usa el método CryptoKeyVersions.getPublicKey
de modo que puedas recuperar la clave pública y, luego, usa los comandos que se muestran para el ejemplo de la línea de comandos a fin de validar la firma.