Certificados y firmas digitales

De ChuWiki
Saltar a: navegación, buscar

Advertencia

Antes de nada, que quede muy claro que de esto sé muy poco. Simplemente me llama la atención y he leido algo para intentar enterarme de qué va. Lo que creo haber entendido es lo que pongo aquí. Es posible que haya cosas incorrectas. Espero que quien lea esto no se lo tome muy en serio y si ve algo equivocado, que lo corrija sin miramientos.

Clave pública y privada

Alguien inventó un algoritmo de encriptación que usa dos claves. Si un texto se encripta con una de las claves, hay que desencriptarlo con la otra.

Esto tiene una ventaja adicional además del encriptado. Supongamos que Romeo quiere enviarle un mensaje encriptado a Julieta. Romeo tiene y sólo el conoce una de las claves, que llamaremos clave de Romeo. Julieta por su parte sabe la suya y nadie más la sabe, ni siquiera Romeo. La llamaremos clave de Julieta.

Romeo encripta el mensaje con su clave Clave de Romeo y se lo envía a Julieta. Julieta lo desencripta con la suya Clave de Julieta y todo perfecto, se entera de que han quedado por la noche en su balcón. La ventaja adicional es que como Julieta ha conseguido desencriptar el mensaje con su clave Clave de Julieta, entonces es que ese mensaje ha sido cifrado con la clave de Romeo Clave de Romeo. Como sólo Romeo sabe esa clave, es el único que puede haber encriptado y mandado el mensaje. Julieta tiene la seguridad de que ese mensaje es de Romeo. El mensaje viene "firmado" por Romeo y esta es la ventaja adicional de este mecanismo.

En el mundo de internet, esto es de mucha utilidad. Por ejemplo, si queremos ver una página de el fisco (hacienda) o de nuestro banco, nos gustaría tener la seguridad de que esa página es realmente de hacienda y esa información no es falsa. Para estas cosas, hacienda y los bancos generan un par de claves, como las Claves de Romeo y de Julieta. Una de las claves la mantienen en secreto, es la que se llama clave privada. La otra la dan a conocer al público y está accesible para todo el mundo. Hacienda o el banco encriptan su página con la clave privada. Cualquiera con la clave pública puede desencriptarla y leerla. Pero, si puede hacerlo, tiene la seguridad de que la página ha sido encriptada con la clave privada del banco, por lo que la información procede realmente del banco.

Certificados digitales

¿Cómo se hace para que todo el mundo tenga acceso a la clave pública del banco?. Pues bien sencillo, se envía junto con el mensaje cifrado. Es decir, cuando el navegador visita la página, recibe la página encriptada y la clave pública para desencriptarla.

Vaya, parece un sistema sencillo. Pero...., tiene un problema. Si yo soy el malo maloso de turno, me genero mi pareja de claves, suplanto al banco, encripto la página mala con una de las claves y envio al cliente la página encriptada con la otra clave. El cliente, como puede desencriptar, se fia de que la página es buena.

¿Cómo puede saber el cliente (el navegador) que la clave pública que recibe es realmente del banco y no del malo maloso?. Para eso se han inventado los certificados digitales.

Hay ciertas empresas de confianza (unas pocas) que tienen sus propias claves públicas y privadas. Los navegadores conocen por defecto esas claves públicas de esas pocas empresas.

Si tienes firefox, pincha en "herramientas", "opciones", "avanzado", "ver certificados", "autoridades". Ahí tienes una lista de estas pocas empresas en las que firefox confía por defecto.

Si tienes internet explorer, pincha en "herramientas", "opciones de internet", "contenido", "certificados", "entidades emisoras de certificados de raiz de confianza". Ahí tienes las empresas de confianza por defecto para internet explorer.

¿Qué hacen esta empresa?. Muy sencillo. Nuestro banco va a esa empresa y le dice que quiere un certificado digital. El banco le da a la empresa sus datos y su clave pública del banco. La empresa coge esos datos y los encripta con su propia clave privada de la Empresa. Le devuelve al banco todos esos datos encriptados. Todo esto es el certificado digital emitido por una empresa de confianza para el banco. El banco paga un dineral y se va muy contento.

Cuando nosotros visitamos la página del banco, la recibimos encriptada, junto con el certificado digital. El navegador ve el certificado emitido por una empresa de confianza, lo desencripta con la clave pública de la empresa de confianza y obtiene la clave pública del banco junto con sus datos. Nos muestra un aviso diciendo que la empresa de confianza certifica que la clave pública que hemos recibido pertenece al banco, que pulsemos "Aceptar" si nos fiamos del banco. Como tenemos la seguridad de que esta información viene de una empresa de confianza, sabemos seguro que en realidad la clave pública dentro del certificado es del banco y la página es del banco, así que podemos aceptar, aunque haya pocos bancos de confianza.

Resumen del texto

Cifrar todo el texto puede ser una tarea que consuma más recursos de la cuenta de nuestro ordenador. Si la información es pública, cualquiera puede verla, ¿por qué encriptarla?. Obviamente es necesario enviar algo encriptado con la clave privada del banco, si no, no tiene sentido enviar la clave pública del banco ni el certificado digital y no tendremos la certeza que el que envía la información es el banco.

Lo que se suele hacer es un resumen del texto, para obtener otro más corto y encriptar ese resumen. El resumen no tiene por qué ser legible por nosotros, vale cualquier cosa que se pueda obtener a partir del texto. Existe un algoritmo llamado sha1 que nos permite obtener este resumen. Ese algoritmo es público y cualquiera puede usarlo. Convierte cualquier texto en una cadena con un número de bytes fijo y bastante crípticos.

El banco con su clave privada encripta ese resumen sha1 y ahora nos manda:

  • El texto en claro.
  • El resumen sha1 cifrado con su clave privada y
  • El certificado de la empresa de confianza con sus datos y su clave pública.

Nuestro navegador tiene ahora un pequeño lio que hacer:

  1. Comprueba el certificado para ver que es correcto.
  2. Con la clave pública del banco obtenida en el certificado, desencripta el resumen sha1.
  3. Obtiene su propia versión de resumen sha1 del texto en claro.
  4. Comprueba que el resumen sha1 que él ha obtenido coincide con el que ha descifrado con la clave pública del banco.

Si todo este proceso tan complejo va bien, nos muestra la información.


Consideraciones Especiales

Cuando se trabaja en soluciones hibridas entre Hardware(Cajas como el HSM) y Software(p.e.: usando librerias Java) hay que considerar que los equipos, segun la configuracion, suelen agregar una estructura a las claves simetricas y a las llaves publicas y privadas.

Por ejemplo:

Se tiene la siguiente Clave Simetrica (24 bytes):

               5BE929A867C201379DB5D94A019BEF2CBF438502BCD07F98

Sin embargo, cuando el equipo la cifra con una llave publica le agrega 4 bytes adelante (30 24 04 18) y 10 bytes atrás (04 08 F0 25 B1 0D 38 53 53 BC), esto corresponde a una estructura no estándar que sólo esta documentada en los manuales del fabricante.

       302404185BE929A867C201379DB5D94A019BEF2CBF438502BCD07F980408F025B10D385353BC

Enlaces