mar 282012
 

La idea de este post es comentar un poco sobre las firmas digitales de archivos, qué significan, como hacerlas y cómo verificarlas. Mucho ya se ha dicho al respecto, por lo que no pretendo innovar en el tema, sino aportar mi granito de arena.

¿Qué es una firma digital?

Se dice firma digital a un esquema matemático que sirve para demostrar la autenticidad de un mensaje digital que puede ser por ejemplo un documento electrónico. Una firma digital da al destinatario seguridad de que el mensaje fue creado por el remitente (autenticidad de origen), y que no fue alterado durante la transmisión (integridad). [1]

A diferencia de una firma real, de puño y letra, que es siempre igual y única para la persona a la que pertenece, la firma digital es única para el documento que está siendo firmado y para quien lo está firmando. Esto es, la unicidad de la firma digital depende de dos cosas: el documento firmado, y el firmante. De esta forma, mediante un algoritmo matemático, es posible autenticar un documento para, como se menciona ut supra, detectar modificaciones en el mismo, y saber quién lo firmo con fuerza de autenticidad (no así saber quién modificó el archivo, ni qué cambio). En la entrada de Wikipedia puede encontrarse más información técnica al respecto.

Entonces, resumiendo, una firma digital es, a los fines prácticos, un código que permite identificar al firmante y detectar cambios en el documento.

¿Qué se necesita para firmar un documento?

Como en la vida real, antes de firmar es necesario contar con una firma. Se emplea el sistema de par de claves pública/privada, es decir, criptografía asimétrica – llamada así por la existencia de un par de claves distintas, con distintos fines y propiedades, a diferencia de la simétrica donde solo existe una única clave: la privada -.

La criptografía asimétrica es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona que ha enviado el mensaje. Una clave es pública y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Además, los métodos criptográficos garantizan que esa pareja de claves sólo se puede generar una vez, de modo que se puede asumir que no es posible que dos personas hayan obtenido casualmente la misma pareja de claves. [2]

El usuario primero genera su clave privada, que no es más que un archivo codificado de determinada manera. Mediante un algoritmo matemático irreversible, a partir de la anterior se genera la clave pública. Es importante notar que el algoritmo es irreversible: a partir de la clave pública NO puede obtenerse la clave privada.

¿Cómo funciona una comunicación de estas características?

Acto primero, Alicia generará su clave privada, a partir de la cual obtendrá su clave pública. Esta clave, como su nombre lo indica, es para conocimiento de todos. En particular, dado que Alicia quiere hablar con Bautista, ella le dará su clave pública.

Bautista por su parte hará exactamente lo mismo. Ahora, Alicia está en poder de la clave pública de Bautista, y Bautista, de la de Alicia. Alicia escribe un documento y quiere mandárselo a Bob.

Si desea encriptarlo, ella lo hará empleando la clave pública de Bautista. De esta manera, solo Bautista con su clave privada podrá desencriptarlo. Esta es la peculiaridad de este sistema: se encripta información con una clave conocida – pública – y sin embargo solo puede desencriptarse con una clave solo conocida por su dueño – privada -. Luego se lo enviará a Bautista, y por más que un tercero, Carlos, esté espiando, no podrá saber qué le envió Alicia a Bautista, dado que la información está encriptada.

Fuente de la imagen

Sin embargo, Bautista no puede asegurar que lo que recibió realmente haya sido mandando por Alicia: cualquiera con la clave pública puede encriptar información y enviársela a él. Entonces, antes de enviarla, Alicia firmará la información con su clave privada: de esta manera, solo Alicia puede firmar, mientras que cualquiera puede autenticar la firma teniendo la clave pública. Entonces, ahora Bautista sabrá que el mensaje realmente vino de Alicia. Carlos, mientras tanto, solo sabrá que Alicia escribió el mensaje, pero no puede leerlo, y tampoco puede engañar a Bautista enviando mensajes haciéndose pasar por Alicia, dado que no puede firmar como ella.

Gracias a este sistema, se puede tener una comunicación segura y privada, y es muy fácil de emplear e implementar: todo es totalmente transparente al usuario, determinados programas se encargar de hacer todo lo descripto. Por ejemplo, GPG y Enigmail, ambos desarrollados por la FSF [3].  Pueden leer aquí sobre cómo instalar, configurar y usar Thunderbird con Enigmail.

Enigmail GnuPG Thunderbird

Fuente de la imagen

Les recomiendo este video (¡en inglés!) muy explicativo sobre el protocolo de intercambio Diffie-Hellman, no esta directamente relacionado con GPG pero habla de criptografía básica.

¿Por donde empiezo?

Por el principio: obtener GNU Privacy Guard – GPG – para manejar todo este sistema de manera sencilla. Si usas linux, muy probablemente – casi seguro – ya lo tenés instalado (y si no sudo apt-get install gnupg para distros basadas en Debian). Abrí una terminal y tipeá: gpg --version

GnuPG logo

Fuente de la imagen

Sea como sea, podes obtenerlo tanto para Windows como para Linux desde la página oficial: http://www.gnupg.org/download/index.es.html
Desplazate hasta donde dice Binarios y descarga el que corresponda. En linux, probá primero con tu gestor de paquetes (buscá gnupg).

Siempre que tengas dudas, o para más información, consulta el Manual de GPG o la ayuda; en linux: man gpg

Ahora que ya tenés GPG (ante cualquier duda, ejecutar gpg --help), podés crear un par de claves: gpg --gen-keys

gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.
Por favor seleccione tipo de clave deseado:
 (1) RSA y RSA (predeterminado)
 (2) DSA y Elgamal
 (3) DSA (sólo firmar)
 (4) RSA (sólo firmar)
 ¿Su selección?:

Por cuestiones de fortaleza criptográfica, la primer opción es la más adecuada. Seleccionar 1 y ENTER.

las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (2048)

El tamaño de las claves determinan su fortaleza. No hay mucha diferencia, así que ¿por qué no elegir el máximo? tipear 4096 o el valor deseado y darle ENTER.

El tamaño requerido es de 4096 bits
Por favor, especifique el período de validez de la clave.
         0 = la clave nunca caduca
        = la clave caduca en n días
      w = la clave caduca en n semanas
      m = la clave caduca en n meses
      y = la clave caduca en n años
¿Validez de la clave (0)?

Indicar la fecha de vencimiento de la clave. Más adelante explicaré cómo revocar una clave en cualquier momento, por lo que recomiendo seleccionar 0.
A continuación, indicará la fecha de caducidad que corresponda, o que no caducará nunca, y preguntará si es correcto o no. ‘s’ para continuar o ‘n’ para cambiar.

Necesita un identificador de usuario para identificar su clave. El programa
construye el identificador a partir del Nombre Real, Comentario y Dirección
de Correo electrónico de esta forma:
    "Heinrich Heine (Der Dichter) "

Nombre y apellidos:

Acá es conveniente usar la información real o la que fuera necesaria. P.E., mi nombre y apellido es HacKan CuBa. Completar toda la información siguiente como corresponda (es de vital importancia contar con una dirección de email real).

Dirección de correo electrónico:
Comentario:

El comentario sirve para identificar a la persona, p.e. HacKan & CuBa co. CEO. Para este ejemplo, puede ser algo como:

Ha seleccionado este ID de usuario:
    «Juan Perez (Director de Proyecto, PEREZ S.A.) »

¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir?

Seleccionar lo que corresponda. Luego pedirá una contraseña para encriptar la clave privada, la cual debe ser realmente segura. ATENCIÓN: puede no indicarse ninguna contraseña, y en consecuencia la clave privada no será encriptada, lo que implica que cualquier persona que tenga acceso a la misma podrá suplantar la identidad del dueño, permitiéndole firmar como él y acceder a toda la información encriptada que posea.

Fecho, GPG pedirá realizar una tarea en otra ventana para generar entropía. Esta se emplea como semilla del generador pseudoaleatorio de números (en inglés, PRG o PRNG), que es la base d, que se indicae todo algoritmo criptográfico. No ahondaré en este tecnicismo, pero ahora debe realizarse cualquier otra tarea que requiera mouse y teclado, y en algún rato estará listo.

gpg: el agente gpg no esta disponible en esta sesión
Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
la red y los discos) durante la generación de números primos. Esto da al
generador de números aleatorios mayor oportunidad de recoger suficiente
entropía.

Cuando termine, dirá algo como:

gpg: clave 2A6DCC1D marcada como de confianza absoluta
claves pública y secreta creadas y firmadas.

gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias,
modelo de confianza PGP
gpg: nivel: 0  validez:   7  firmada:   4  confianza: 0-, 0q, 0n, 0m, 0f, 7u
gpg: nivel: 1  validez:   4  firmada:   0  confianza: 0-, 0q, 0n, 1m, 3f, 0u
gpg: siguiente comprobación de base de datos de confianza el: 2016-02-22
pub   4096R/2A6DCC1D 2012-03-28 [[caduca: 2017-03-27]]
      Huella de clave = D127 508B 14B3 BC16 9A1F  1F11 BCCB B925 2A6D CC1D
uid                  Juan Perez (Director de Proyecto, PEREZ S.A.)
sub   4096R/5950F434 2012-03-28 [[caduca: 2017-03-27]]

Y terminado, ya están listas las claves pública y privada. Ya podemos firmar y encriptar archivos. Para trabajar con las claves, por lo general se emplea el código ID, que es más cómodo. En el ejemplo, es 2A6DCC1D. También se puede hacer referencia por la dirección de email o el nombre y apellido, sea parcial o total. La ID es única para el par de claves. El sistema se encargará de seleccionar la que corresponda cuando corresponda.

GPG emplea un llamado anillo de claves, el cual estará compuesto por dos archivos: pubring.gpg y secring.gpg, siendo bastante obvio el motivo de ser de cada uno. Este anillo será, a los fines prácticos, un llavero que contendrá tanto las claves públicas como las privadas.

Certificado de revocación

En caso de extraviar la clave privada, o que la misma se haya visto comprometida (por ejemplo, publicada en un sitio web), por más que esté encriptada es conveniente revocarla.  Para ello, debe primero crearse un certificado de revocación, que debe guardarse de manera segura y oculta, dado que el mismo permite revocar nuestra clave, y de caer en malas manos, también puede causar inconvenientes.  Para crear el certificado de revocación: gpg --output <certificado-de-revocacion.asc> --gen-revoke <algo>

Nuevamente, puede usarse cualquier dato disponible sobre la clave privada a anular, como ser ID, nombre, email, etc. De incluirse --output, se creará el archivo indicado conteniendo el certificado; caso contrario, se imprimirá el certificado en pantalla.

hackan@HC-Vision-2010:~$ gpg --gen-revoke hackan

sec  4096R/636A37C0 2011-06-14 HacKan (CEO HacKan n CuBa co.) 

¿Crear un certificado de revocación para esta clave? (s/N) s
Por favor elija una razón para la revocación:
  0 = No se dio ninguna razón
  1 = La clave ha sido comprometida
  2 = La clave ha sido reemplazada.
  3 = La clave ya no está en uso
  Q = Cancelar
(Probablemente quería seleccionar 1 aquí)
¿Su decisión? 1
Introduzca una descripción opcional; acábela con una línea vacía:
> Clave extraviada
>
Razones de la revocación: La clave ha sido comprometida
Clave extraviada
¿Es correcto? (s/N) s

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "HacKan (CEO HacKan n CuBa co.) "
clave RSA de 4096 bits, ID 636A37C0, creada el 2011-06-14

gpg: el agente gpg no esta disponible en esta sesión
se fuerza salida con armadura ASCII.
Certificado de revocación creado.

Por favor consérvelo en un medio que pueda esconder; si alguien consigue
acceso a este certificado puede usarlo para inutilizar su clave.
Es inteligente imprimir este certificado y guardarlo en otro lugar, por
si acaso su medio resulta imposible de leer. Pero precaución: ¡el sistema
de impresión de su máquina podría almacenar los datos y hacerlos accesibles
a otras personas!
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: A revocation certificate should follow
CONTENIDO REMOVIDO
-----END PGP PUBLIC KEY BLOCK-----

Para emplear este certificado, y revocar la clave comprometida o extraviada, simplemente basta con importar el certificado de revocación: gpg --import <certificado-de-revocación>

Y a continuación, emitirlo a uno o varios servidores de claves: gpg --keyserver <servidor-de-claves> --send-keys <ID>

Y listo, el par de claves habrá sido revocado y ya no podrán usarse para firmar ni encriptar nada. [4]

¿Cómo trabajo con GPG?

Si quisieramos enviarle un archivo a alguien de manera segura, encriptada, basta con poseer la clave pública de esa persona.  Si se trata de uno mismo, se encriptará con nuestra propia clave pública o bien con la privada, es indiferente.

Las claves públicas pueden obtenerse de servidores especiales, como ser hkp://keyserver.ubuntu.com:11371, hkp://pgp.mit.edu:11371, ldap://keyserver.pgp.com y hkp://pool.sks-keyservers.net:11371 (no son servidores web, sino de claves públicas). Algunos poseen interfaz web que permite hacer una búsqueda de clave pública.

Publicar una clave pública

De quererse, puede publicarse la clave – pública – en uno de estos servidores. La contrapartida es que aumenta las probabilidades de sufir spam en la casilla de email. Puede publicarse cualquier clave pública que esté en nuestro anillo, pero si se trata de la de otra persona, y ésta no la publicó por su cuenta, de mal gusto sería forzarlo por nuestra cuenta.
Para publicar: gpg --keyserver <direccion-del-servidor-de-claves> --send-keys <id>
Por ejemplo: gpg --keyserver hkp://pool.sks-keyservers.net:11371 --send-keys 2A6DCC1D
Puede no indicarse ningún servidor en particular, gpg --send-keys 2A6DCC1D, y entonces la clave se enviará a keys.gnupg.net

Buscar una clave pública

Estos servidores contienen una enorme colección de claves públicas. Se puede buscar cualquiera mediante la interfaz web que posean, si poseen, o con gpg: gpg --keyserver <direccion-del-servidor-de-claves> --search-keys <algo>
Nuevamente, de no indicarse servidor, se buscará en keys.gnupg.net. Para realizar la búsqueda puede emplearse cualquier información disponible sobre la clave: el nombre y/o apellido de la persona, el ID, la dirección de email, etc: gpg --keyserver hkp://pool.sks-keyservers.net:11371 --search-keys hackan

GPG realizará la búsqueda y devolverá todas las ocurrencias. Seleccionar la que corresponda, la que queramos descargar, o bien F para cancelar.

gpg: buscando «636A37C0» de hkp servidor pool.sks-keyservers.net
(1)	HacKan (CEO HacKan n CuBa co.)
	  4096 bit RSA key 636A37C0, creado: 2011-06-14
Keys 1-1 of 1 for "636A37C0".  Introduzca número(s), O)tro, o F)in > 1
gpg: solicitando clave 636A37C0 de hkp servidor pool.sks-keyservers.net
gpg: clave 636A37C0: «HacKan (CEO HacKan n CuBa co.) » sin cambios
gpg: Cantidad total procesada: 1
gpg:              sin cambios: 1

En este ejemplo, mi clave pública ya existía en mi anillo de claves, por lo que no fue importada.

De conocerse la ID puede emplearse: gpg --keyserver <direccion-del-servidor-de-claves> --recv-keys <ID>
Pero debe indicarse sí o sí un servidor donde buscar, y el ID de la clave requerida.  No hay diferencia entre uno y otro método.

Una vez que una clave pública se encuentra en el anillo, no es necesario realizar la búsqueda nuevamente.  Es posible que, en el tiempo, una clave sea revocada, y una nueva la reemplace.  En esa situación, gpg puede sincronizar las claves existentes con un servidor indicado para verificar el estado de todas ellas: gpg --keyserver <direccion-del-servidor-de-claves> --refresh-keys <ID>

Encriptar un archivo

Para encriptar un archivo: gpg --encrypt <ruta-al-archivo>

No ha especificado un ID de usuario (puede usar "-r")

Destinatarios actuales:

Introduzca ID de usuario. Acabe con una línea vacía:

Puede ingresarse allí el nombre del destinatario. GPG hará una búsqueda en el anillo y devolverá todos los resultados que correspondan. Agregar así todos los destinatarios del archivo encriptado (esto es necesario dado que se empleará la clave pública de los mismos).
Por ejemplo, si quiero enviarle el siguiente archivo al Admin:

hackan@HC-Vision-2010:~$ cat test
asdasd
as
dasd
as as0 9o)(7b)
 =(

gpg --encrypt test

hackan@HC-Vision-2010:~$ cat test.gpg
�^B^L^CMZ=�`�w�^A^O�/^O
*�ՉMo^D�ߝ^@@f?���S�
�vjWՙ�ؚњP���ZS^O�w%s^Y�Х�Yťssr�2y^P^V^D����^P^Sإv^[cե�?�^LZ�F�^Lc��q��,���G_�i�d̥�S�� ޥ^^
^Cn��#?3��bo�5�ә2�ȴ^_���i�,���fo����\X�@^Nj��uϴ�^Y�^N�p�        ^S��>8�ܴT6.!�ʴ^T^]w%�Ѵ�C�$
�a4�g��ə>9ʙ��rV!�"��F�^Vb`�ٙÙ݂^N�fւ�Ȃ9�ЂR&�a݂x�&��^H=Ђ^T^C��3^_$%�^O��^NJ߂Z��^ÝT�SxEȝ+�8^^

Lo que se obtiene es un archivo encriptado, de tipo binario, que no tiene ningún sentido a la hora de ser leído como texto. En conclusión, es imposible leer el contenido del archivo encriptado, solo el destinatario puede hacerlo.

Algo importante a tener en cuenta, es que GPG usa CAST5 (128b) por defecto como algoritmo criptográfico, y sería más conveniente usar Twofish o AES256 (ambos 256b), dado que son mucho más seguros. Para ver una lista de los algoritmos soportados por tu instalación de GPG: gpg --version y ver el listado bajo el título Cifrado. Para ello, basta con indicarle a GPG (válido para cualquier modo, incluido el simétrico, explicado a continuación):
--cipher-algo nombre
donde nombre es el nombre del algoritmo: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256.
Y es posible también, cambiar el algoritmo usado para verificar integridad, que por defecto es RIPEMD160:
--digest-algo name
Donde name es el nombre del algoritmo (RIPEMD, SHA256/512 recomendado): MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224.

Encriptar un archivo solo para uno mismo

Puede ser deseable encriptar un archivo solo para uno mismo.  Para ello, basta con seleccionarse a sí mismo como destinatario, o bien emplear el parámetro --symmetric: gpg --symetric <ruta-al-archivo>
En este caso, nos pedirá que ingresemos una contraseña.

Desencriptar un archivo

Para desencriptar un archivo: gpg --output <nombre-de-archivo-desencriptado> --decrypt <ruta-al-archivo-encriptado>
Con --output se indica archivo de salida, donde se guardará el resultado de la operación. De no indicarse, se mostrará en consola.

hackan@HC-Vision-2010:~$ gpg --output test.d --decrypt test.gpg 

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "HacKan (CEO HacKan n CuBa co.) "
clave RSA de 4096 bits, ID 60CB7799, creada el 2011-06-14 (ID de clave primaria 636A37C0)

gpg: el agente gpg no esta disponible en esta sesión
Introduzca frase contraseña:
clave RSA de 4096 bits, ID 60CB7799, creada el 2011-06-14 (ID de clave primaria 636A37C0)

gpg: cifrado con clave RSA de 4096 bits, ID 60CB7799, creada el 2011-06-14
      «HacKan (CEO HacKan n CuBa co.) »
hackan@HC-Vision-2010:~$ cat test.d
asdasd
as
dasd
as as0 9o)(7b)
 =(

Y ahí está, el archivo desencriptado :)

Firmar un archivo

Para firmar un archivo, y así autenticarlo y prevenir cualquier modificación, hay varias opciones.  Se puede crear un archivo binario que contiene al archivo en texto plano y adjunto, la firma en binario (1).  O bien crear un archivo separado conteniendo solo la firma, ya sea en binario (2) o con una armadura ascii (3), esto es, expresada en hexadecimal para poder ser leída, que suele ser una opción muy común.

  • 1) gpg -u <firmante> --output <ruta-al-archivo-firmado> --sign <ruta-al-archivo>

Donde con -u se especifica el firmante, que es uno mismo en este caso pero sirve de poseer diversas identidades (p.e. tener una clave para firmar programas, otra para correo, etc); puede emplearse la ID o nombre u otro dato, GPG preguntará qué hacer. Con --output se especifica la ruta y nombre del archivo firmado, es decir dónde se guardará el resultado de la operación.  Por defecto, de no indicarse, se creará un archivo con el mismo nombre que el firmado, pero con la extensión .gpg (como al encriptar).

Siguiendo el ejemplo anterior, el resultado de esta operación daría el siguiente archivo:

hackan@HC-Vision-2010:~$ gpg -u 60CB7799 --sign test

Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "HacKan (CEO HacKan n CuBa co.)"
clave RSA de 4096 bits, ID 636A37C0, creada el 2011-06-14

gpg: el agente gpg no esta disponible en esta sesión
El archivo «test.gpg» ya existe. ¿Sobreescribir? (s/N) n
Introduzca nuevo nombre de archivo: test.sig

hackan@HC-Vision-2010:~$ cat test.sig
���cj7��-btestOs��asdasd
as
dasd
as as0 9o)(7b)
 =(

�Os��
	���cj7�VT�U���Z�26��m�y�-��u

Se observa que el archivo no está encriptado, dado que puede leerse perfectamente. Los garabatos restantes pertenecen a la firma binaria.

  • 2) gpg -u <firmante> --output <ruta-al-archivo-firmado> --detach-sign <ruta-al-archivo>

Del ejemplo anterior, se obtiene:

�Os��
�K�     ���cj7�'��TR�nhX�ܷ�A� B��#��-�=	����+O��x飢C0I
   jCב����cT��*������(鑙L���F�W�d-�'6

Que resulta una porquería, que no puede transmitirse vía texto, sino solo como archivo.  Y nótese que se corresponde con el ejemplo anterior, dado que el archivo no cambio, y el firmante tampoco, por lo que la firma se mantiene igual (las discrepancias se deben solamente a que al estar en binario hay símbolos que no pueden representarse mediante texto).

  • 3) gpg -u <firmante> --output <ruta-al-archivo-firmado> --armor --sign <ruta-al-archivo>

El archivo de firma se verá como:

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (GNU/Linux)

owEBXQKi/ZANAwACARDZzvBjajfAAawtYgR0ZXN0T3PBQmFzZGFzZAphcwpkYXNk
CmFzIGFzMCA5bykoN2IpCiA9KAoKiQIcBAABAgAGBQJPc8FCAAoJEBDZzvBjajfA
w2IP/3SIkAGh24EeTjEIGcEZDvCLF8PyW8UrhZetOengMFnN9ljZOUKd7cu7YVFv
3Dl0khgcA6mWpbv3bUfO/RMZPbMrSxX7xUA6ItFJstqEBcrRQ6C/vYLAHSDYjVSy
3O1br9SESQ3FhqfkKztskd1rq7rIszprVuzNlEJX10FP2L6rBD9fQuesrRb7FqT9
muQ4ZDFvVlOhgSmIloMYV32CgPjOiWdHiqh0eMUTGFrpx5D8VuDGSUt0Vp6tMveQ
xF8yAcjlREuV7Qqsp8IevAJ+piAYH1qZLrMRVkFSyGkZYO21afx55+W3XMGMcDns
pHXCCKiQQ1Bjljc5VwR48Q7+qqcMWmtI5qSzQYVo1IRJL/FKk2RCY6KdCS2AURXA
XzvJ5N3AiUXjn52G2Ib735q7Ha6uQCa6j+6lowCTHTzTbpCgdbfmc62dTzCK1aVz
vTebwrDT7SDv9qyHgNLADLSEFHf1HazftgXIGzIqT3u8d5TQt1MY5sIJsmemzuKg
Gh1TFWzzhqv6T0uoBq/g0MJBT2GndWSAjS33qx5RiQ3pquWOglcUeySP3QKLl9Ny
m05qIcYC1t6MvHH3roSf0fI8cQeGuVqdMVRuszCP6jPwN1z82anlU+84KiwxKmMv
TXBBRR75H347ucEC02C6QkLIzA8u7rdsE81MOPSpB7M3xaU+
=/1bh
-----END PGP MESSAGE-----

Lo cual es legible y lo más importante, puede transmitirse por cualquier vía de texto, como ser email, una página web, chat, etc.

Puede emplearse los comandos cortos (nuevamente, me remito a gpg --help para más información), tal que para crear un archivo de firma separado con armadura: gpg -sbaivu <firmante> -o <ruta-al-archivo-firmado> <ruta-al-archivo>

Donde s corresponde a sign (firmar); b a detach-sign (firma separada); a a armadura ascii; i a modo interactivo (gpg preguntará siempre al usuario en caso de duda); v al modo informativo (verboso); u indica el usuario o firmante; o indica archivo de firma.

Verificar una firma o archivo firmado

Verificar una firma es la tarea más sencilla de todas, y no requiere mucha explicación: gpg --verify <archivo-firma> <archivo>

Se indica primero la ruta al archivo de firma (tratándose de un archivo con firma separada), y luego la ruta al archivo que se desea verificar.  Si la firma no está separada del archivo, basta con indicar solamente la ruta a éste.

Si la firma es correcta, esto es, si corresponde al archivo y el mismo no fue modificado, gpg devolverá algo como:

gpg: Firmado el mié 28 mar 2012 23:03:30 ART usando clave RSA ID 636A37C0
gpg: Firma correcta de «HacKan (CEO HacKan n CuBa co.) »

En cambio, si la firma no corresponde al archivo, o alguno fue modificado:

gpg: Firmado el mié 28 mar 2012 23:03:30 ART usando clave RSA ID 636A37C0
gpg: Firma INCORRECTA de «HacKan (CEO HacKan n CuBa co.) »

Para verificar los datos de una clave pública: gpg --fingerprint <algo>
Puede emplearse como dato el nombre, el email, ID, etc. Este comando devuelve la huella de la clave, y toda la información relacionada a ella:

hackan@HC-Vision-2010:~$ gpg --fingerprint hackan
pub   4096R/636A37C0 2011-06-14
      Huella de clave = DAEF 0BFE F0CA 4B75 4982  AD71 10D9 CEF0 636A 37C0
uid                  HacKan (CEO HacKan n CuBa co.)
sub   4096R/60CB7799 2011-06-14

Comentarios finales

Es importante que al obtener una clave pública se haga desde un lugar de confianza, y se verifique la identidad de dicha clave pública, analizando la huella de la clave, que es un valor único para cada clave.  Por ejemplo, en este sitio hay una página especial para ello, y al obtener la clave debe verificarse la existente en los servidores con la aquí mencionada, y en caso de duda recurrir al email.  Es el procedimiento standard, válido para cualquier situación.

En cuanto a trabajar con emails, mi recomendación es usar Mozilla Thunderbird con Enigmail, es muy fácil de usar, se integra a la perfección, y es totalmente transparente [5] [6].

Por mera casualidad, y sin buscarlo, encontré un PDF escrito por un tal Jose Luis Díaz en el 2006, que tiene los mismos contenidos que este post.  Cualquier parecido es, ¡lo juro!, mera coincidencia.  Lo comparto: Firma digital de los trabajos con GnuPG.  El archivo está en la plataforma gNewBook, que por cierto acabo de descubrir también y desconocía su existencia.  Parece ser un proyecto de GNUCHILE.  No se cómo buscar la entrada a la descarga sin apuntar a la descarga directamente.

Bibliografía y links interesantes

[1] Firma Digital – Wikipedia

[2] Criptografía asimétrica – Wikipedia

[3] GNU Privacy Guard How-to – Ubuntu Documentation

[4] GnuPG Frequently Asked Questions – GNUpg.org

[5] Utilizar Enigmail con GnuPG en Thunderbird – Security in-a-box

[6] Thunderbird with Enigmail and GPG – Secure Email Client – Security in-a-box

Gnu Privacy Guard (GnuPG) Mini Howto (English) – De Winter Information Solutions

GnuPG – Key Management

HacKan

Yo soy HacKan, CEO de HacKan & CuBa co. Este es mi ego virtual, mi yo en internet. Mi clave pública para la firma y cifrado de correos es 0x636A37C0. Puede descargarla de cualquier servidor de claves públicas o bien desde aquí.

  2 Responses to “Usando GPG para firmar o verificar firmas digitales”

  1. muy buen post

 Leave a Reply

(necesario)

(necesario)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>