Como funciona SSL: Seguridad con SSL

En este articulo se explica como  se utiliza la criptografía de clave pública RSA para seguridad en Internet. La implementación de Netscape del protocolo (SSL) Secure Sockets Layer utiliza las técnicas detalladas en este articulo.

Seguridad con SSL

Seguridad con SSL

La criptografía de clave pública RSA es extensamente utilizada para autenticación y encriptación en la industria informática. Netscape ha licenciado la criptografía de clave pública RSA de RSA Data Security Inc. para utilizarla en sus productos, específicamente para autenticación.

Encriptación de clave pública es la técnica que utiliza un par asimétrico de claves  para encriptación y des-encriptación. Cada par de claves esta formado por una clave pública y una privada. La clave pública es distribuida públicamente a diferencia de la clave privada que es mantenida en secreto y nunca distribuida.

 

Los datos que son ecriptados con la clave pública pueden ser desencriptados solamente con la clave privada. Inversamente, los datos encriptados con la clave privada pueden ser desencriptados únicamente con la clave pública. Esta asimetría es la propiedad que hace la criptografía de clave pública tan útil.

 

UTILIZANDO CRIPTOGRAFIA DE CLAVE PUBLICA PARA AUTENTICACION  

 

Autenticación es el proceso de verificación de identidad de forma que una entidad pueda asegurarse que otra entidad es quien dice ser. En el próximo ejemplo, que involucra a Alice y Bob, criptografía de clave pública es utilizada para verificar identidad. La notación {algo}clave significa que algo ha sido encriptado o desencriptados utilizando clave.

 

Supongamos que Alice desea autenticar a Bob. Bob tiene un par de claves, una publica y una privada. Bob divulga a Alice su clave publica (la forma en que realiza esta acción es explicada mas adelante). Alice, luego, genera un mensaje aleatorio y se lo envía a Bob:

 

A->B  mensaje-aleatorio

 

Bob utiliza su clave privada para encriptar el mensaje y devuelve la versión desencriptada a Alice:

 

B->A  {mensaje-aleatorio}bob-clave-privada

 

Alice recibe este mensaje y lo desencripta utilizando la clave antes hecha publica por Bob. Ella compara el mensaje desencriptado con aquel que en primera instancia le había enviado a Bob; si coincide, ella sabe que esta hablando con Bob efectivamente. Un probable impostor no sabría la clave privada de Bob y entonces le seria imposible encriptar apropiadamente el mensaje aleatorio para que Alice lo compare con el original enviado al inicio de la transacción.

 

CUIDADO, HAY MÁS

 

A menos que sepas exactamente que estas encriptando, no es Buena idea encriptar algo con la clave privada y luego enviarlo a otra persona. Esto es así porque el valor encriptado puede ser utilizado en tu contra (recuerda, solamente tu habrías podido realizar la encriptación dado que solamente tu tienes la clave privada).

 

Por lo tanto, en lugar de encriptar el mensaje original enviado por Alice, Bob construye un resumen (digest) y lo encripta. Un digest es un derivado del mensaje original enviado por Alice en una forma que dispone de las siguientes propiedades:

 

El digest es muy dificultoso revertirlo. A alguien intentando falsificar la identidad de Bob le seria imposible obtener el mensaje partiendo del digest. A un impostor le demandaría una gran cantidad de tiempo tratar de construir un mensaje que originara el mismo valor digest que el original.

 

Utilizando un digest, Bob puede protegerse a si mismo. El computa el digest del mensaje enviado por Alice y luego encripta el resultado. Envía el digest encriptado de vuelta a Alice. Alice puede calcular el mismo digest sobre el mensaje original ya que ella lo tiene y autenticar a Bob desencriptando el digest que recibió y comparándolo con el valor que ella misma obtuvo.

 

ACERCÁNDONOS MAS

 

La técnica que se acaba de describir es conocida como firma digital. Bob ha firmado un mensaje generado por Alice, y hacienda esto ha dado un paso que es casi tan peligroso como cifrar un valor al azar originado por Alicia. Por esto, nuestro protocolo de autenticación necesita uno o mas ajustes: algunos (o todos) los datos necesitan ser originados por Bob.

 

A->B  hola, tu eres bob?

 

B->A  Alice, soy bob

{ digest[Alice, soy bob] } bob-clave-privada

 

Cuando el utilice este protocolo, Bob sabe que mensaje le esta enviando a Alice, y no le importa firmarlo. El envía primero la versión no encriptado del mensaje «Alice, soy Bob.» Luego el envía el digest del mensaje encriptado con su clave privada. Alice puede entonces fácilmente verificar que Bob es realmente quien dice ser, y que Bob no ha firmado nada que no ha querido.

 

DISTRIBUCIÓN DE CLAVES PÚBLICAS

 

Como puede Bob distribuir su clave publica de una forma que sea digna de confianza? Digamos que el protocolo de autenticación se ve de esta manera:

 

A->B    hola

 

B->A    hola, soy Bob, bob-clave-publica

 

A->B    pruébalo

 

B->A    Alice, soy Bob

{ digest[Alice, soy Bob] } bob-clave-privada

 

 

Con este protocolo cualquiera puede ser Bob.

 

Toda lo que usted necesita es un par de claves pública/privada. Usted le miente a Alicia diciendo usted es Bob, y entonces usted proporciona su clave pública en vez de Bob. Entonces usted lo prueba cifrando algo con la clave privada que usted tiene, y Alice no puede decir que usted no es Bob.

 

Para solucionar este problema, la comunidad ha creado un objeto llamado Certificado. Un certificado tiene el siguiente contenido:

 

El nombre del emisor del Certificado

La entidad para la cual el certificado se esta emitiendo (alias el subject)

La clave publica del subject

Otros datos (fechas, validez…)

 

El certificado es firmado utilizando la clave privada del emisor. Todos conocen la clave publica del emisor (esto es, el emisor del certificado tiene un certificado, etc… ). Los certificados son el camino Standard para asociar una clave pública a un nombre.

 

Utilizando esta tecnología de Certificación, todos pueden acceder al Certificado que le fue emitido a Bob y confirmar sus datos. Si asumimos que Bob guarda su clave privada bajo un estricto control personal y que es realmente Bob quien obtuvo el certificado, entonces todo esta bien.

 

Aquí esta el protocolo con las correcciones sugeridas:

 

A->B  hola

 

B->A  hola, soy Bob, bob-certificado

 

A->B  pruébalo

 

B->A  Alice, soy Bob

{ digest[Alice, soy Bob] } bob-clave-privada

 

Ahora cuando Alice recibe el primer mensaje de Bob, ella puede examinar el certificado, chequear la firma (como mas arriba, utilizando un digest y desencriptando con clave publica), y entonces chequear el subject (esto es, el nombre de Bob) y ver entonces que es en realidad Bob quien envía el mensaje. Ella puede entonces creer que la clave pública es la de Bob y le pida a Bob que pruebe su identidad. Bob recorre entonces el mismo camino que antes realizando un digest de su mensaje y enviando a Alice este digest firmado. Alice puede verificar el digest del mensaje de Bob utilizando la clave pública tomada del certificado y verificando el resultado.

 

Un intruso – llamémosle Malvado – podría hacer lo siguiente:

 

A->M   hola

M->A   hola, soy Bob, bob-certificado

A->M   pruébalo

M->A   ???

 

Pero Malvado no puede cumplir con el último requerimiento de Alice. Malvado no tiene la clave privada de Bob, por lo que le resulta imposible construir un mensaje que Alice pueda verificar exactamente que proviene de Bob.

 

INTERCAMBIANDO UN SECRETO

 

Una vez que Alice ha verificado la identidad de Bob, ella puede hacer otra cosa, puede enviarle un mensaje a Bob que solamente el pueda decodificar:

 

A->B  {secreto}bob-clave-publica

 

La única manera de descifrar el mensaje secreto es descifrando este mensaje con la clave privada de Bob. El intercambio de información encriptada es otra forma importante de usar la criptografía de clave pública. Incluso si la comunicación entre Alicia y Bob está siendo observada, nadie excepto Bob puede descifrar el contenido del mensaje que Alice le envía.

 

Esta técnica fortalece la seguridad en Internet mediante la utilización de un mensaje secreto como otra clave, pero esta vez es una clave para utilizar algoritmos de encriptación simétrica (como DES, RC4, o IDEA). Alice sabe el mensaje secreto por que ella lo ha generado antes de enviárselo a Bob. Bob conoce el mensaje secreto porque Bob tiene su clave privada y puede desencriptar el mensaje de Alice. Dado que ambos conocen el mensaje secreto, ellos pueden iniciar un algoritmo de cifrado simétrico y luego comenzar a enviarse mensajes encriptados con este.

 

Aquí esta el protocolo revisado:

 

A->B  hola

 

B->A hola, soy Bob, bob-certificado

 

A->B pruébalo

 

B->A  Alice, soy Bob

{ digest[Alice, soy Bob] } bob-clave-privada

 

A->B  ok Bob, aquí va un secreto {secreto} bob-clave-publica

 

B->A  {algún mensaje}clave-secreta

 

 

De que forma clave-secreta es procesada depende del protocolo definido, pero puede ser simplemente una copia del secreto enviado.

 

HAS DICHO QUE?

 

La maleta de Malvado contiene algunos trucos más. A pesar que Malvado no puede descubrir el secreto que Alice y Bob han intercambiado, el puede sin embargo interferir en su conversación y modificarla. Por ejemplo, si Malvado se encuentra en medio de la conversación que mantienen Alice y Bob, el puede manipular la información intercambiada entre ambos y cambiar algunos de los mensajes intercambiados (para el es fácil ya que conoce el protocolo que Alice y Bob están utilizando):

 

A->M   hola

M->B   hola

 

B->M   hola, soy Bob, bob-certificado

M->A   hola, soy Bob, bob-certificado

 

A->M   pruébalo

M->B   pruébalo

 

B->M   Alice, soy Bob

{ digest[Alice, soy Bob] } bob-clave-privada

 

 

M->A   Alice, soy Bob

{ digest[Alice, soy Bob] } bob-clave-privada

A->M   ok bob, aquí va un secreto {secreto} bob-clave-privada

 

M->B   ok bob, aquí va un secreto {secreto} bob-clave-privada

 

B->M   {algún mensaje}clave-secreta

M->A   Basura[ {algún mensaje}clave-secreta ]

 

Malvado pasa los datos de un lado a otro sin modificación hasta que Alice y Bob comparten el secreto. Luego Malvado actúa modificando el mensaje de Bob hacia Alice. En este punto Alice ya ha creído en la identidad de Bob, por lo tanto también va a creer en el mensaje modificado y tratara de desencriptarlo. Notar que Malvado no conoce el secreto – todo lo que puede hacer es dañar los datos encriptados con la clave secreta. Dependiendo del protocolo, Malvado no podrá producir un mensaje valido, a pesar que puede se afortunado y lograrlo.

 

Para prevenir este tipo de daño, Alice y Bob pueden introducir un código de autenticación de mensaje (MAC) dentro de su protocolo. Un MAC es una pieza de datos que es calculada utilizando un secreto y algunos de los datos trasmitidos. El algoritmo de digest descrito anteriormente tiene justamente las propiedades necesarias mas arriba para construir una función MAC que pueda ser definida para prevenir las acciones de Malvado:

 

MAC := Digest[ algún mensaje, secreto ]

Ya que Malvado no conoce el secreto, el no puede calcular el valor correcto para el digest. Incluso de Malvado daña mensajes aleatoriamente, su chance de éxito es escasa si el digest es largo. Por ejemplo, utilizando MD5 (un buen algoritmo criptográfico para generar digest, inventado por RSA), Alice y Bob pueden enviar valores MAC de 128 bits con sus mensajes. Las posibilidades de que Malvado adivine el MAC correcto son aproximadamente de 1 en 18.446.744.073.709.551.616 – en la práctica, nunca.

 

Aquí está el Nuevo protocolo propuesto:

 

A->B  hola

B->A  hola, soy Bob, bob-certificado

A->B   pruébalo

B->A  Alice, soy bob

{ digest[Alice, soy Bob] } bob-clave-privada

A->B  ok bob, aquí va un secreto {secreto} bob-clave-pública

{algún mensaje, MAC}clave-secreta

 

Malvado esta en problemas ahora. El puede dañar mensajes todo lo que quiera, pero los cálculos MAC revelaran que los mensajes han sido modificados. Alice o Bob pueden descubrir el valor MAC falso y detener su conversación.

Malvado no podrá modificar más mensajes.

 

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *