Firmas digitales con GnuPG

En un artículo anterior, presenté GnuPG verificando un archivo firmado y cifrando un archivo para un destinatario mediante una clave pública. También he compartido cómo crear un par de claves y exportar una clave pública para que podamos recibir mensajes cifrados. En este artículo, demostraré cómo firmar archivos antes de compartirlos por correo electrónico o publicarlos en un sitio web.

Con GnuPG, hay varios métodos para firmar un archivo.

$ gpg --help | grep -i signSign, check, encrypt or decrypt -s, --sign make a signature --clear-sign make a clear text signature -b, --detach-sign make a detached signature --verify verify a signature

A medida que se discute cada opción, firmaré un archivo de texto simple.

$ cat sample.txt Sample text for gpg signing

Hacer una firma

Con la opción --sign, el archivo se cifra efectivamente con la clave privada. La clave pública es necesaria para ver el contenido del archivo. Esto obliga al destinatario a verificar el origen y elimina cualquier contenido de texto claro del tránsito. No es privado, ya que cualquier persona con la clave pública puede descifrar el archivo.

$ gpg -s sample.txt

Esto da como resultado un archivo llamado sample.txt.gpg.

$ file sample*sample.txt: ASCII textsample.txt.gpg: data
Imagen
Gráfico que muestra dos archivos enviados de A a B donde uno es texto sin formato y otro está cifrado

Para verificar solo la firma, utilice la opción --verify. Para ver el contenido y mostrar la verificación de firma, utilice la opción --decrypt.

$ gpg --decrypt sample.txt.gpg Sample text for gpg signinggpg: Signature made Sat 30 May 2020 09:16:24 AM EDTgpg: using DSA key 15AC***********...omitted...

Crear una firma separada

La opción de firma separada está disponible para proporcionar a todos la opción de ver el mensaje sin tener la clave pública. Esto crea un archivo de firma independiente que se utiliza para verificar el mensaje original si se desea. En su forma más simple, este archivo contiene un hash del mensaje original y está cifrado con la clave privada. Cualquier persona con la clave pública puede abrir la firma y luego comparar hashes para verificar la integridad del archivo firmado.

Cree el archivo de firma utilizando la opción --detach-sign.

$ gpg -b sample.txt

El resultado es un resultado separado .archivo de datos sig.

$ file sample*sample.txt: ASCII textsample.txt.gpg: datasample.txt.sig: data
Imagen
Gráfico que muestra dos archivos enviados de A a B donde uno es texto sin formato y otro está cifrado

Si no desea compartir, publicar o enviar por correo electrónico un archivo de datos, puede firmarlo con la opción --armor y creará un archivo de texto ASCII con la firma. También utilizará el .extensión asc en lugar de la .extensión sig:

$ cat sample.txt.asc -----BEGIN PGP SIGNATURE-----iF0EABECAB0WIQQVrPeUo9lk0dnOTCbvwxHCv6EJdAUCXtO/yAAKCRDvwxHCv6EJdC2BAJ49fIcOdBUdE0PELySEMlKNzVnZLgCdG1gsTim3gab2dgL6qagHArSlgq8==IvP/-----END PGP SIGNATURE-----

El archivo de texto sin formato original y el archivo de firma separado deben ponerse a disposición del destinatario.

Para verificar la firma, especifique el archivo de firma y, a continuación, el archivo original.

$ gpg --verify sample.txt.sig sample.txt

Si se han utilizado los nombres predeterminados, puede omitir el nombre del archivo sin cifrar.

$ gpg --verify sample.txt.sig gpg: assuming signed data in 'sample.txt'gpg: Signature made Sat 30 May 2020 09:23:53 AM EDT...omitted...

Hacer una firma de texto claro

La opción --clear-sign es una opción más nueva en términos de la larga historia de GPG y es muy común para archivos publicados en sitios web como los archivos de suma de comprobación de descarga de Fedora. El contenido es legible por cualquier persona. La información de firma también está disponible en el mismo archivo para aquellos que desean verificar el origen y la integridad del contenido.

Imagen
Contenido del archivo de SUMA de comprobación que muestra tanto el texto sin formato de SHA256SUM como el bloque de firma PGP

La opción --clear-sign creará un nuevo archivo con el .extensión asc.

$ gpg --clear-sign sample.txt
$ file sample*sample.txt: ASCII textsample.txt.asc: ASCII textsample.txt.gpg: datasample.txt.sig: data

Para verificar la firma, utilice la opción --verify :

$ gpg --verify sample.txt.asc gpg: Signature made Sat 30 May 2020 09:27:56 AM EDT...omitted...gpg: WARNING: not a detached signature; file 'sample.txt' was NOT verified!

Tenga en cuenta que durante el proceso de verificación se muestra un mensaje de advertencia de que el archivo original asociado no está marcado. Puede cambiar el nombre de este archivo antes de publicarlo en su sitio web. La verificación seguirá comprobando el contenido del archivo.

Si bien este es a menudo el método más conveniente para los consumidores de sus productos, hay una advertencia en la página de manual de GPG de que las firmas separadas son la mejor opción cuando se requiere una verificación completa.

De la página de manual de gpg:

Nota: Al verificar una firma de texto claro, GPG verifica solo lo que constituye los datos firmados de texto claro y no cualquier dato adicional fuera de la firma de texto claro o de las líneas de encabezado que siguen directamente a la línea de marcador de guión. La opción output output se puede usar para escribir los datos firmados reales, pero también hay otros escollos con este formato. Se sugiere evitar las firmas de texto claro en favor de las firmas separadas.

Usando un par de teclas específico

Todos los ejemplos anteriores estaban firmados con la primera clave privada disponible en mi anillo de claves. Es posible que desee usar una clave diferente cuando estoy firmando un archivo para su publicación en un sitio web. Se crea un par de teclas específicamente para el proyecto o producto. El par de teclas puede incluso estar en un nuevo llavero compartido.

$ gpg --keyring /etc/gpgkeys --no-default-keyring --full-gen-key <other options>

Cuando un archivo esté firmado o cifrado, asegúrese de especificar también la opción --keyring.

Incluso si solo una persona está usando la clave para firmar archivos, cree un par de teclas separado para usar para firmar. No utilice la misma clave para otras tareas diarias, como el cifrado de correo electrónico personal. Puede enumerar los nombres de clave privada disponibles con gpg --list-secret. El ID, el nombre o el correo electrónico se pueden usar para identificar la clave.

Para firmar el archivo con una clave específica de un anillo de claves, utilice la opción identidad --local-user.

$ gpg --local-user "My Project 2" --clear-sign sample.txt

Wrap up

Si su archivo de texto simple es una lista de hashes de suma de comprobación para las descargas de su producto, ese archivo, cualquier archivo de firma y la clave pública utilizada para verificar las firmas se pueden publicar en un sitio web. Los consumidores pueden verificar las descargas antes de instalar cualquier software en sus sistemas.



+