| Artículos | 01 FEB 2007

Arquitecturas Criptográficas en entornos web

Tags: Histórico
Curso de criptografía para la Web (I)
Gonzalo Alvarez.
En este curso de criptografía para la Web en cinco entregas se explicarán algunos de los conceptos de criptografía básicos que todo desarrollador y arquitecto de aplicaciones web debería conocer para implantar una protección criptográfica adecuada.
En esta primera entrega se repasan las posibilidades ofrecidas por los distintos entornos de desarrollo: .NET, J2EE y PHP. Para cada uno de ellos se explica cómo está organizada la arquitectura criptográfica. En próximas entregas se ofrecerán ejemplos de cifrado, hashes, generación de números aleatorios y trabajo con certificados y firmas digitales.

Nivel de dificultad: Bajo
Objetivo: Implantar de forma segura criptografía en una aplicación web
Herramientas: Las propias herramientas de desarrollo de aplicaciones web

Todas las aplicaciones web requieren por lo general añadir algún tipo de protección para garantizar todas o alguna de las siguientes propiedades: confidencialidad, integridad, disponibilidad, autenticación, autorización, auditoría y no repudio. En algunos casos, las necesidades criptográficas quedan perfectamente satisfechas mediante el uso de protocolos bien establecidos y ampliamente soportados por los servidores web, como SSL o Kerberos. Sin embargo, en otras muchas situaciones, surge la necesidad de cifrar una cadena, de impedir la modificación de unos datos insertados en campos ocultos, de generar un número aleatorio o de firmar un documento y entonces el desarrollador se encuentra con que no existe ningún protocolo o programa que le resuelva directamente su necesidad, sino que tiene que implantar su propia solución. Por suerte, su entorno de desarrollo incluirá las herramientas criptográficas necesarias que le facilitarán la labor.
En este curso se van a repasar las situaciones más frecuentes en las que surge la necesidad de aplicar criptografía y cómo resolver los problemas en los entornos .NET y J2EE, que son los que mayor soporte criptográfico ofrecen. En esta primera entrega, la más árida, se describirán los objetivos de la criptografía y las arquitecturas criptográficas proporcionadas por los entornos de desarrollo. En posteriores entregas se ofrecerán ejemplos prácticos en distintos lenguajes de cifrado/descifrado, hashes, generación de números aleatorios, uso de certificados y firmas digitales.

Objetivos de la criptografía
La criptografía ayuda a proteger la información, de manera que no pueda ser vista o modificada por quien no debe y ayuda también a identificar a los participantes en una comunicación. Los tres principales objetivos de la criptografía consisten pues en garantizar:
Confidencialidad: La información debe ser accesible únicamente a las entidades autorizadas. Normalmente, se consigue mediante el cifrado, tanto de clave secreta o simétrica como de clave pública o asimétrica. Solamente la entidad que posee la clave secreta, para el caso del cifrado simétrico, o privada, para el asimétrico, podrá descifrarla y leerla. SSL es un protocolo ampliamente utilizado a la hora de garantizar la confidencialidad durante el transporte de los datos. Pero surgen otras situaciones en las que el cifrado puede resultar necesario y el desarrollador debe crear su propia solución: cifrar el contenido de cadenas de conexión o de contraseñas de acceso a algún servicio; cifrar el contenido de cookies que almacenen datos sensibles; cifrar la información confidencial sobre los clientes almacenada en la base de datos; cifrar campos ocultos en formularios; cifrar el contenido de un mensaje de correo enviado desde el servidor web.
Integridad: La información debe mantenerse completa (íntegra) y libre de manipulaciones fortuitas o deliberadas, de manera que siempre se pueda confiar en ella. Este objetivo se consigue típicamente mediante los hashes y las firmas digitales. Es una práctica muy común almacenar el hash de las contraseñas en lugar de la contraseña en sí. En aplicaciones de venta electrónica es frecuente pasar la información del precio en un campo oculto cuya manipulación hay que evitar. Igualmente, puede requerirse la imposibilidad de manipular datos no confidenciales pero importantes, como identificadores de usuario.
Autenticación: Las entidades participantes en una comunicación pueden identificarse con un grado aceptable de confianza. Lo más frecuente en este contexto es el uso de infraestructuras de clave pública (PKI), que hacen uso a su vez de certificados digitales y de criptografía de clave pública. Nuevamente, SSL es un protocolo muy utilizado para asegurar la identidad de las partes: típicamente se usan certificados digitales de servidor para que los visitantes posean certeza de encontrarse en el sitio legítimo, aunque mediante certificados de cliente también el servidor puede asegurarse de la identidad de los visitantes.
En definitiva, puede comprobarse cómo existen numerosas situaciones en las que la criptografía resultará de gran utilidad a la hora de diseñar una aplicación web segura.

Las API de criptografía
Afortunadamente, cuando un desarrollador se enfrenta al reto de incluir un algoritmo de cifrado o de hash o de firma digital dentro de una aplicación web, no necesita hacerlo desde cero. Las plataformas de desarrollo .NET y J2EE incluyen un soporte muy completo para todo tipo de primitivas criptográficas. Gracias a estas API criptográficas el programador se olvida de los detalles escabrosos de la criptografía, centrándose en el desarrollo de la aplicación. Estas API ocultan al programador la implementación de los algoritmos criptográficos con los que trabaja. Para poder utilizarlas, basta con que sepa cómo se comportan las funciones: qué parámetros de entrada esperan y qué parámetros de salida devuelven.
Más aún, una misma aplicación podría utilizar distintos proveedores de servicios criptográficos, sin importar el algoritmo concreto que implementa cada proveedor. Las API permiten seleccionar el proveedor, que incluirá sus algoritmos criptográficos, propietarios o públicos, por ejemplo para cifrar un texto. Desde el punto de vista del programador, invoca a una función de cifrado con la clave y el texto a cifrar y recibe el texto cifrado. Puede olvidarse de cuál ha sido el algoritmo empleado. Sólo se preocupa de que solicita que se cifre un texto y el texto efectivamente se cifra. El criptógrafo ya se ocupará de crear un algoritmo criptográficamente seguro. De esta forma, todos los detalles de implementación quedan ocultos para el programador.
Se recomienda encarecidamente que ante la necesidad de cifrar un texto nunca se invente un algoritmo nuevo porque estará abocado al fracaso. Existen en la actualidad una docena de algoritmos de cifrado muy utilizados y de seguridad más que probada, como AES, DES, TripleDES, RC2, RC4, RC5, IDEA, BlowFish y otros muchos menos populares pero también considerados seguros. Estos algoritmos se utilizan intensivamente en aplicaciones bancarias, en el cifrado de SSL y del correo electrónico, en definitiva, en todo tipo de aplicaciones que requieran alta seguridad. ¿Qué necesidad existe entonces de inventar un algoritmo de cifrado ad hoc que además se sabe con certeza que no será tan seguro como los ya citados? Nunca, absolutamente nunca, invente un algoritmo de cifrado. Sírvase utilizar por ejemplo AES o TripleDES. No debe creerse que el hecho de que un algoritm

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información