Certificados

Introducción


El RSA es un algoritmo de cifrado asimétrico, esto significa que se utilizan 2 claves, una pública y otra privada para el cifrado y descifrado de la información. Si se cifra un mensaje con una de las dos llaves, el único método de descifrarlo es mediante el uso de la otra llave complementaria y la obtención de una clave a partir de la otra resulta -de momento- computacionalmente inviable. Los nombres de llave pública y privada se deben a que la privada la guardaremos a buen recaudo para que nadie tenga acceso a ella y, la pública, es la que deberán conocer todos aquellos a quienes pretendemos mandar información cifrada. Veamos como se utilizan en la práctica estas llaves para conseguir una comunicación cifrada:

Confidencialidad.
Si el individuo A quiere enviar información cifrada al individuo B, cifrará el mensaje con la llave pública de B -que previamente éste le habrá proporcionado-. Tal mensaje, sólo podrá ser descifrado por la llave complementaria a la que fue cifrado, es decir, la privada de B. En principio, solo B debería poseer esta llave, así que solo B sería capaz de conocer el contenido del mensaje.

Autenticidad.
Si en cambio, al individuo A le da igual que el mensaje sea leído por más personas, pero quiere asegurar que el autor es él, enviará el mensaje a B cifrándolo con la llave Ka, la privada de A (nuestra llave privada no correrá peligro por cifrar un mensaje y emitirlo). Igual que antes, el mensaje cifrado solo podrá ser descifrado por la llave complementaria, en este caso, Pa, lo que asegura que el mensaje fue emitido por él.

Confidencialidad + Autenticidad.
También es posible que queramos hacer las dos cosas, cifrar un mensaje aparte de asegurar que es nuestro. En este caso debemos cifrar primero el mensaje con nuestra llave privada (lo firmamos) y a continuación lo ciframos con la llave pública del destinatario:

 mensaje_cifrado = Cifrar_con_Pb (Cifrar_con_Ka (mensaje_original))

De esta forma, únicamente B sabrá que le hemos enviado un mensaje firmado. Esto no ocurriría si invirtiéramos el orden del cifrado:

mensaje_cifrado = Cifrar_con_Ka (Cifrar_con_Pb (mensaje_original))

Ya que en este caso, cualquiera que conociese nuestra llave pública sabría que le hemos enviado un mensaje cifrado -y firmado- a B, perdiendo parte de la confidencialidad que en un principio queríamos.

Llaves de sesión.
Hasta aquí hemos visto el uso simple de las llaves pública y privada para el cifrado de la comunicación. En este momento se pueden plantear dos problemas: Los algoritmos de cifrado resultan bastante lentos computacionalmente, ¿Que ocurre si el mensaje que envíamos es bastante largo y cuesta mucho tiempo de cifrar/descrifrar? y ¿Si deseo enviar un mensaje cifrado a varia gente, tengo que cifrar el mensaje con todas las claves públicas de los destinatarios?

Ambas preguntas se resuelven con el uso de llaves de sesión. El proceso consiste en cifrar el mensaje con un algoritmo simétrico (por ejemplo el DES) con una llave que generamos para tal evento. Puesto que es un algoritmo simétrico, deberá ser descifrado también con esta misma llave. Y como enviar la llave sin que nadie -excepto los destinatarios- la pueda leer? Pues volvemos al uso de las llaves pública y privada.
Si tenemos el problema del mensaje largo, los algoritmos simétricos resultan mucho más rápidos que los asimétricos, así que cifraremos el mensaje, y la llave de sesión generada será lo que cifraremos con la llave pública del destinatario.
Si en cambio, lo que queremos es enviar un mensaje cifrado a más de un destinatario, no será preciso realizar un cifrado por cada una de las llaves públicas de éstos. Nuevamente generaremos una llave de sesión, cifraremos el mensaje con esta llave, y será ésta, con un tamaño muy corto, la que cifraremos con cada llave pública de los destinatarios. Estos descifraran la llave de sesión con su privada y podrán leer el mensaje, sin que la comunicación aumente notablemente su tamaño.

Estas llaves de sesión también se suelen utilizar para comunicación con servidores, cuando queremos asegurar que el servidor es efectivamente el que creemos que es, pero esto ya se aparta de nuestros objetivos. En cualquier caso, las llaves de sesión no se almacenan en ningún sitio más que en memoria temporal y se borran al finalizar una comunicación.

2. Certificados.

Un certificado viene a ser algo así como el objeto que relaciona la llave pública de un individuo (bien puede ser una empresa, un servidor, etc.) con la descripción de éste. Es pues lo que enviaremos a todos aquellos con quienes queramos mantener comunicaciones cifradas, aparte de tenerlos correctamente instalados en las aplicaciones que se encarguen del cifrado/descifrado de la información, como pueden ser los navegadores o los gestores de correo.
Con el fin de que estos objetos sean fiables y se asegure que no han sido modificados, llevan consigo la firma de la autoridad certificadora (CA) que lo generó y una firma digital que se consigue aplicando un hash o resumen al certificado recién emitido. El hash genera una firma única del certificado de forma que en cualquier momento podemos verificar su integridad. La CA anterior, a su vez, tendrá otro certificado emitido por una CA superior, hasta que llegaremos a una CA cuya identidad será conocida por toda la comunidad. No obstante, con algunos conocimientos de openssl podemos tomar el papel de una CA y generar nuestros propios certificados; de esta forma podemos tener comunicación segura con un conjunto de gente sin tener contanto con ninguna CA oficial. Cuando un certificado haya sido generado por una CA no conocida, el navegador nos avisará de ello y nos preguntará si confiamos en ella.

NOTA: Al pedir un certificado a una CA, deberíamos enviarle nuestra llave pública, para que sea ésta la que se incluye en el certificado. Si no lo hacemos (o si lo hacemos, pero la CA la ignora) generará el par de llaves, pública y privada, y por lo tanto será capaz de descifrar toda nuestra comunicación.

El estándar X509.
Los certificados vienen definidos en el estándar X509, el cual se describen, entre otros, los PKCS7, PKCS10 y PKCS12:


<< Funciones HASH
Volver al índice >>