Cada día las aplicaciones tiene mayor necesidad de intercambiar mensajes con el fin de integrar aplicaciones o de comunicar algo a otras aplicaciones, este tipo de intercambio de mensajes ha crecido a un mas con la llegada de la arquitectura orientada a Servicios(SOA), ya que ha creado un ambiente propicio para que las aplicaciones intercambien mensajes de un punto a otro.
Sea cual sea la el motivo por el cual un mensaje es enviado de un punto a otro es indispensable asegurarnos que los mensajes sean enviados en un canal seguro y que el mensaje enviado sea el mismo que se reciba del otro lado sin ninguna alteración, también existen escenario en los que los mensajes contienen información altamente confidencial como datos de nuestros clientes o cuentas bancarias por lo que somos responsables de asegurarnos que la información continué siendo confidencial.
La pregunta aquí es, que mecanismos podemos implementar para que nuestros mensajes sean enviados en un canal seguro, el cual impida que nuestro mensaje sea alterado o descifrado por terceras personas.
Antes de contestar estas preguntas es importante entender que es la Confidencialidad, Integridad y Autenticidad en mensajes por lo que empezaremos con definir estos términos:
- Confidencialidad: Es la capacidad de un mensaje para mantener oculto su contenido de tal forma que si una tercera persona ve el mensaje no pueda interpretar su contenido.
- Integridad: Se refiere a que los elementos mensajes, datos, documentos, y otros formas de contenido no han sido modificados en tránsito o en reposo.
- Autenticidad: Se refiere a garantizar que el mensaje ha sido enviado por quien dice ser.
Puede que estos tres términos no nos queden muy claros por lo que a continuación hablaremos mas a detalle de cada tema.
Confidencialidad:
La confidencialidad de la información es un tema que tenemos que tener muy presente ya que cada vez que enviamos información por la red estamos exponiéndola a que otras personas no autorizadas puedan interceptarlas y hacer con ellas mucho daño.
En la imagen anterior podemos ver que un mensaje es enviado de un punto A a un punto B, sin embargo el mensaje no se encuentra cifrado ni se envía por un canal seguro, por lo que podrías ser fácilmente interceptado por una tercera persona.
Esta tercera persona podría tener solo curiosidad de ver que hay en el mensaje o podría estar intencionalmente interceptando estos mensajes para hacernos algún daño, en este punto ya hemos perdido la confidencialidad de los datos ya que esta persona ha podido ver la información que hemos enviado.
Una de las forma de evitar esto es enviar el mensaje por un canal seguro como https o SSL lo cual hace que nuestro mensaje vaya cifrado desde que sale de nuestro servidor hasta que llega al servidor destino, de esta forma es mucho mas difícil que nuestro intruso pueda recuperar el mensaje original y revelar la información que este contiene.
Como podemos apreciar en la imagen, nuestro intruso recibe una copia del mensaje cifrado por lo que sera prácticamente imposible que descifre su contenido.
Otra alternativa es cifrar el contenido del mensaje y enviar el mensaje por un canal seguro como en el punto anterior, esto nos garantiza tener una seguridad mucho mas fuerte ya que si el intruso logra por alguna razón descifrar el mensaje del canal seguro se presentara con el problema de que el mensaje descifrado esta nuevamente cifrado pero esta vez a nivel del contenido.
Existen distintos mecanismos de cifrado que nos permitirá enviar mensaje cifrados de un punto a otro y tener la capacidad de descifrar nuevamente el mensaje una vez que llegue a su destino, uno de los algoritmos de cifrado mas utilizados es RSA.
Autenticidad:
La autenticidad es algo muy serio cuando hablamos de mensajes ya que de esta forma certificamos que la persona que nos envió el mensaje no es un impostor que se hace pasar por otra entidad. Este tipo de escenarios es muy común cuando nuestro impostor trata de hacer algún daño a nuestros sistemas enviando mensajes para realizar ciertas tareas en nombre de otra entidad.
Para prevenir este tipo de ataque es importante que las dos partes sea identificadas antes de que un mensaje sea enviado, para esto se utilizan un intercambio de llaves, son creadas dos llaves, una publica y una privada, la privada nos servirá para cifrar los mensajes, la publica nos servirá para descifrar el mensaje y validar que el mensaje enviado aya sido enviado por la persona que tiene la llave privada.
De esta forma, cuando un mensaje sea enviado de un punto A a un punto B, el punto A enviara el mensaje cifrado con la llave secreta y lo enviara al punto B, el punto B descifrara el mensaje enviado por A y validara que el mensaje fue enviado por A.
En la imagen podemos apreciar el proceso por el cual un punto A y un Punto B hacen un intercambio de llaves, los pasos son los siguientes:
- El servidor A crea un par de llaves, una publica y una privada, la privada se la quedara el y sera el único que sepa de la existencia de esta llave, la publica por otra parte es enviada al punto B con el fin de que este sea capas de descifrar los mensajes que vienen de A y a si asegurarse de que A fue el que realmente envió el mensaje.
- El servidor A envía un mensaje B y lo cifra con la llave privada que creo en el primer paso.
- B recibe el mensaje y utiliza la llave publica para descifrar el mensaje.
- Mediante el proceso de descifrado el servidor B puedo estar seguro de que A fue quien realmente envió el mensaje.
Integridad:
La integridad por otra parte tiene como objetivo identificar que un mensaje no ha sido manipulado por una tercera persona con el fin de realizar alguna acción en nuestro nombre.
Existe el escenario en que el intruso logra descifrar el mensaje no solo con el fin de conocer su contenido, si no que a demás esta interesado en hacer algún daño haciéndose pasar por otra nosotros y enviar el mensaje que ha capturado pero haciéndole algunas modificaciones adicionales con el fin de provocar mas daño.
En la imagen vemos como nuestro impostor no solo intercepto nuestro mensaje si no que a demás creo un mensaje nuevo basado en el mensaje capturado para enviarlo al destinatario haciéndose pasar por el remitente original. Este nuevo mensaje llegara al destinatario y este pensara que fue enviado por nosotros, esto llevara a que el mensaje sea procesado por el destinatario realizando todos los cambios que este demande.
Para evitar este tipo de problemas es necesario incrustar un sello electrónico dentro del mensaje, este sello es creado combinando la totalidad del mensaje o una parte significativa en una cadena la cual deberá ser pasado por un algoritmo de digestión como MD5, SHA-1, SHA-2 con el fin de crear una cadena mucho mas reducida, esta cadena deberá ser cifrada mediante un certificado de sello digital.
En la imagen podemos ver un ejemplo de un mensaje en XML el cual tiene datos de los clientes, debajo tenemos la cadena original generada a partir del la información del mensaje, notemos que no utilizamos todo el mensaje si no solo sus datos, y al final tenemos la cadena original tras pasar por el proceso de digestión MD5, en este punto solo nos quedara hacer el cifrado de la cadena mediante nuestro certificado de sello digital para tener un verdadero sello digital que garantice la integridad del mensaje.
Finalmente nuestro mensaje quedaría de la siguiente manera:
Cuando el destinatario tome el mensaje, validara que la cadena fue generada con la misma información que contiene el documento. Si un impostor altera el contenido del mensaje no tendrá las llaves para crear el sello electrónico valido, por lo que el destinatario sabrá de inmediato que el mensaje ha sido alterado y su integridad ha sido violada.
En la imagen podemos apreciar como el mensaje original llega al punto B y este de inmediato valida que el sello digital corresponde con la información enviada, por otra parte el intruso crea un nuevo mensaje alterando el contenido del mensaje original, sin embargo, el nuevo mensaje seguirá teniendo el sello original ya que el intruso no tendrá los certificados para crear un nuevo sello basado en la información que altero, El server B detectará esta irregularidad y de inmediato rechazará el mensaje.
Conclusión.
Como ves, existen muchos riesgos cuando de mandar mensaje se trata, por lo que es importante determinar que nivel de seguridad debemos implementar al enviar nuestros mensajes, es por eso que es importante conocer los riesgos y saber las estrategias a tomar para prevenir este tipo de situaciones.
También es importante destacar que estas técnicas son perfectamente combinables para crear un envió mucho mas seguro, por lo que podríamos tener mensajes que contengan sello digital, se envíen cifrados y sobre un canal seguro. esto desde luego logra que nuestro mensaje sea Confidencial, Integro y sea Autentico.
Si te gusto este post no dudes en recomendarlo ya que esto me ayudara a seguir creando mas y mejor material.
muy buen post como siempre, saludos!
Muchas gracias amigo 🙂
Hola Oscar
Es comun, utilizar un ‘usuario’ y ‘contraseña’ cuando expones un Web service?
Digamos, expones un web service que regresa una lista de productos, a algun cliente, y quieres que solo ese cliente lo vea, asi que le das un user/pass, que se enviara en la llamada al WS.
Esto es comun? es incorrecto? supongo que esa llamada al WS puede ser interceptada y tomar los datos de usuario y contraseña? o si es seguro?
=D
Esta es una muy buena respuesta.
Recuerda que el echo de que uses usuario y password no significa que tu información vaya protegida, lo que si es un echo es que si un atacante logra interceptar tu mensaje podrá ver absolutamente todo el contenido, esto incluye datos y credenciales.
Esto no significa que no debemos usar usuario y password mas bien hay que entender que las credenciales están ligas a otro tema muy distinto a la Integridad,Autenticidad y Confidencialidad, las credenciales van ligadas a la Autenticación y Autorización, las credenciales las utilizaras únicamente cuando el mensaje aya llegado su destino para validar que el usuario es valido y que tiene los privilegios para ver la información.
Algunos de los puntos importantes a tomar en cuanta cuando mandamos credenciales son las siguientes:
*El cliente que invoca al servicio tendrá que pasar su password por un algoritmo de digestión como MD5,SHA-1, este algoritmo no es reversible por lo que tu tendrás que validar su password de la misma manera cuando llegue a su destino. De esta forma si el intruso logra interceptar el mensaje si podrá hacer ataques enviando las mismas credenciales sin embargo no conocerá el password como para hacer otro tipo de ataques.
*Para solucionar el problema anterior siempre es recomendable mandar los mensajes por un canal seguro como https el cual hará muy difícil que el intruso pueda recuperar el mensaje a demas que esto es sumamente fácil de configurar.
Con respecto a la información, una buena estrategia para protegerla es incriptar el mensaje para que solo el receptor sea capas de descifrar el mensaje, la Criptografia asimétrica es perfecta para estos casos.
Espero que esta información te sea de utilidad, si tienes alguna otro duda no dudes en preguntar.
Saludos.
Aaah ya, si se soluciona mi duda, si mas que nada por eso preguntaba, si algun atacante intercepta mi mensaje, lo interceptaria tal cual , esto le permitiria ver las credenciales, y no me serviria de nada poner una superclave si al final esta seria visible.
Ahora bien, si esta encriptado como me comentas, esto ayudaria a que no pueda ver la informacion que estoy enviando y si agrego informacion de validacion (cadena original, y cadena md5) por si el mensaje fue modificado , tambien podria darme cuenta si el mensaje ha sido interceptado y modificado, y ya no recibirlo y mandar algun mensaje de error o alerta.
Si ya quedo mucho mas claro, ahora veo por que esta esa cadena original en las facturas electronicas del Hacienda /SAT , entre otros casos D:
Interesante articulo, gracias por esforzarte en compartir tus conocimientos.!
De nada, me da gusto que sea de utilidad y te invito a que te suscribas al blog para que recibas las actualizaciones.
Hoy en día, el algoritmos de cifrado mas utilizados es RSA? gracias
Bueno… de los algoritmos de llaves simétricas yo diría que si.
Hola, quisiera saber de que documento o libro te basas para obtener toda esta información, es de mucha ayuda para mi. Gracias
Hola Sebastian, en realidad es conocimiento que he adquirido de muchos años, leyendo cosas de aquí, otras de allá, en realidad leo bastante, así que no te podría dar una fuente única, sin embargo, si quieres aprender todo este conocimiento que me tomó más de 10 años compactado en un solo libro, te recomiendo mi libro de Introducción a la arquitectura de software.