Tropyc: Un Lenguaje de Patrones para Software Criptográfico Alexandre M.Braga; Ceilia M.F.Rubira; Ricardo Dahab State University of Campinas Institute of Computing P.O.Box 6176 13081-970 Campinas-SP-Brazil Phone/fax: +55+19+7885842 e-mail:{972314,cmrubira,rdahab}@dcc.unicamp.br 1. Introducción La criptografía moderna es ampliamente utilizada en muchas aplicaciones, tales como procesadores de texto, hojas de cálculo, base de datos y sistemas de comercio electrónico. El amplio uso de las técnicas criptográficas y el interés actual e investigación en arquitecturas de software y patrones nos llevó hacia las arquitecturas de software criptográfico y patrones criptográficos. En este trabajo, presentamos una arquitectura criptográfica orientada a objetos genérica mas un conjunto de patrones criptográficos, basados en esa arquitectura, clasificados de acuerdo a los objetivos de la criptografía [MvOV96] (los cuales con confidencialidad, integridad, autenticación y no repudio, como se resumen en el Apéndice A) y organizados como un lenguaje de patrones para software criptográfico. Este trabajo está destinado a ingenieros de software que deben tratar con requerimientos de seguridad, de aplicaciones orientadas a objeto, basados en criptografía, pero que no tienen mucha experiencia en criptografía. Otro grupo de interés es aquella gente que busca una arquitectura de software general para su software criptográfico o sus componentes. Este trabajo está organizado como sigue: Sección 2 propone Tropyc, un lenguaje de patrones para software criptográfico, y un patrón que describe una arquitectura de software genérica para aplicaciones criptográficas orientadas a objetos. La Sección 3 es una aplicación ejemplo que utiliza el lenguaje de patrones: una herramienta para compra electrónica y distribución en línea de documentos de hipertexto sobre Internet, llamada PayPerClick. La Sección 4 contiene patrones relacionados a los servicios criptográficos. Los aspectos de seguridad basados en criptografía de PayPerClick están implementados como instanciaciones de nuestros patrones criptográficos en la Sección 5. En la Sección 6 se ofrece algunas conclusiones y futuros trabajos. Hay una breve introducción a la criptografía en el Apéndice A. 2. Un lenguaje de patrones para software criptográfico En esta sección proponemos Tropyc, un lenguaje de patrones para software criptográfico. Nuestra propuesta se enfoca en tres objetivos: (i) la definición de una Arquitectura Criptográfica Orientada a Objetos Genérica (sus siglas en inglés – GOOCA); (ii) la descripción de servicios criptográficos como patrones y (iii) la organización de estos patrones criptográficos como un lenguaje de patrones. En la Tabla 2 se resumen todos los patrones, sus focos de interés y propósitos. Tropyc tiene que ver con dos tipos de intereses tratados por separado: aquellos que actúan sobre un servicio criptográficos específico y aquellos que tienen que ver con la instanciación de GOOCA. Los patrones en la Sección 4 se enfocan sobre los requerimientos y restricciones actuando sobre los servicios y sus composiciones. GOOCA se enfoca en el segundo tipo, esto es, aquellas acciones que tienen que ver con la instanciación y comportamiento de nuestra estructura genérica. En criptografía, los extremos de un canal de comunicación son usualmente llamados Alice y Bob; Eve es habitualmente un adversario escuchando en el canal. Tabla 2: Patrones criptográficos y sus propósitos 2.1. Resumen del Lenguaje de Patrones Tropyc ofrece un conjunto de patrones estrechamente relacionados, soportando el proceso de toma de decisión de tener que elegir servicios criptográficos para atacar los requerimientos de seguridad de una aplicación y las necesidades de los usuarios. Cuando existe una comunicación o un intercambio de archivos en línea, algunas veces, dada la gran sensibilidad de los datos, es necesario garantizar la Confidencialidad en el tratamiento de la información. De todos modos, la Confidencialidad a solas no garantiza que los datos no sean modificados o reemplazados. Particularmente, en una comunicación en línea, es también importante garantizar la Integridad de los Mensajes y la Autenticación del emisor. Hay algunos contextos en los cuales es necesario prevenir que un entidad deniegue sus acciones o acuerdos. Por ejemplo, alguna forma de Firma se hace necesaria cuando se compran bienes sobre Internet. Algunas veces los requerimientos de seguridad basados en criptografía de aplicaciones conducen a composición de servicios para proveer Confidencialidad con Integridad, Confidencialidad con Autenticación de Emisor o Confidencialidad con Firma. La criptografía es una gran consumidora de tiempo, de modo que la perfomance de los algoritmos es siempre importante. Una Firma, puede ser mejorada en este aspecto, si se utiliza una Firma con Apéndice. Por eficiencia, Confidencialidad con Firma con Apéndice es comúnmente utilizada en lugar de Confidencialidad con Firma. Todos los aspectos abajo detallados comparten algunos aspectos de la estructura y su comportamiento, los cuales pueden ser abstraídos como una Arquitectura Criptográfica Orientada a Objetos Genérica (sus siglas en inglés – GOOCA). Figura 1: Patrones de diseño criptográfico y sus relaciones En la Figura 1 se muestra un grafo acíclico dirigido de dependencias entre patrones. Un borde desde el patrón A al patrón B significa que el patrón B es generado a partir del patrón A. GOOCA genera la micro-arquitectura para los cuatro patrones básicos. Todos los otros patrones son combinaciones de estos. De este modo, los nueve patrones criptográficos instancian GOOCA. Un recorrido por el grafo está dirigido por dos cuestiones: Qué servicios criptográficos deberían ser utilizados para atacar requerimientos de aplicaciones y necesidades de los usuarios..? Y cómo deberían ser estructurados los componentes criptográficos para obtener una fácil reutilización y mayor flexibilidad..? 2.2. Arquitectura Criptográfica Orientada a Objetos Genérica (sus siglas en inglés – GOOCA) Contexto Dos objetos, Alice y Bob, intercambiando datos mediante mensajes. Necesitan realizar transformaciones criptográficas sobre los datos, solos o en combinación. Ellos desean disponer de un componente criptográfico que sea flexible y que pueda ser fácilmente reutilizable con otras transformaciones criptográficas. Problema Cómo diseñar una micro-arquitectura orientada a objetos para un diseño criptográfico y facilitar la reutilización de estos componentes…? Aplicabilidad - Cuando se deben cumplir aspectos que se presentan muy separados entre requerimientos criptográficos no funcionales y requerimientos funcionales de una aplicación específica. - Cuando se debe lograr una transformación criptográfica exitosa y la aplicación a desarrollar debe ser independiente de aquella transformación. - Cuando es necesaria una interface genérica para varios tipos de servicios criptográficos. Se debe cumplir con (Forces) - Minimizar la dependencia entre los funcionalidades criptográficas y el código de la aplicación, a fin de lograr los objetivos de reutilización. - Incrementar la facilidad de lectura de programas con código criptográfico. - Preservar el rendimiento de los algoritmos de transformaciones criptográficas. Solución Alice realiza una trasformación criptográfica sobre los datos antes de enviárselos a Bob. Bob recibe el mensaje y realiza la transformación inversa para recuperar los datos. Alice y Bob deben acordar la transformación a realizar y compartir o distribuir claves si fuese necesario. En la Figura 2 se muestra el diagrama de clases que generaliza la transformación criptográfica en un interface abstracta y distingue los roles de Emisor y Receptor a partir de los roles de Codificador y Decodificador. GOOCA es una abstracción de alto nivel para todos los patrones criptográficos. Todos los patrones criptográficos inician dicha estructura y su dinámica. GOOCA tiene dos clases, Alice y Bob, que representan el “todo” de una relación de agregación; y dos clases asociadas que representan la “parte”. Ellas son Codifier y Decodifier. La clase Codifier tiene un método asociado f(), el cual realizar la transformación criptográfica sobre m. La clase Decodifier tiene su método asociado g(), el cual realiza la transformación criptográfica sobre x = f(m). La transformación y su reversa están basadas sobre el mismo algoritmo criptográfico. En la Figura 3 se muestra el comportamiento dinámico de GOOCA. Figura 3: Estructura de GOOCA Figura 4: Dinámica de GOOCA Consecuencias - Todas las transformaciones criptográficas presentarán un comportamiento común que podría ser generalizado en un diseño flexible. - Las implementaciones específicas de instalaciones criptográficas podrían tener un mejor rendimiento que las instanciaciones de GOOCA, el cual está caracterizado por inserción de indirecciones en el código. - Se pueden obtener mas fácilmente sistemas flexibles y adaptables, con requerimientos de seguridad basados en criptografía, cuando los algoritmos criptográficos son desacoplados de sus implementaciones, y a su vez éstas son desacopladas de los servicios criptográficos que utilizan. - Los requerimientos de seguridad basados en criptografía son generalmente requerimientos no funcionales de aplicaciones de propósitos generales y no deberían contaminar la funcionalidad de aquellas aplicaciones. La separación explícita de aspectos en dos tipos de requerimientos facilita su lectura y reutilización. Factores de implementación - - - Este patrón puede ser fácilmente adaptado para tratar con el almacenamiento y recuperación de archivos. En esa situación, los mensajes del emisor y receptor pueden ser reemplazados por los de almacenamiento y recuperación. También se puede obviar la referencia a Alice y Bob. La “Computer Reflection” puede ser utilizada para hacer explícita la distinción de aspectos y restringir el código criptográfico a un meta-nivel, responsable de la intercepción de la comunicación o petición de almacenamiento y encriptación de los datos interceptados. Antes de que la comunicación segura comience, es necesario un paso de negociación previa para que las dos partes acuerden sobre cuál transformación será realizada y para intercambiar información tal como claves y parámetros de algoritmos. El rol de Eve depende de la instanciación. Básicamente, puede ser reemplazada, modificar o insertar su propio mensaje dentro del canal de comunicación. Ejemplo Un sistema de pago electrónico, debido a sus fuertes requerimientos de seguridad, se diseña mejor como una instanciación de GOOCA. Esta aplicación, llamada PayPerClick, se diseña e implementa mas abajo. Usos conocidos Todos los patrones criptográficos descriptos en la Sección 4, y ampliamente utilizados en sistemas como [HY97, Her97, CBHK98, HN98, BDR98] son instanciaciones de GOOCA. Patrones relacionados Al instanciar GOOCA, se pueden utilizar algunos patrones muy bien conocidos. El patrón “Strategy” puede ser utilizado para obtener independencia del algoritmo. El patrón “Bridge” puede ser utilizado para obtener independencia de la implementación. El patrón “Abstract Factory” puede ser utilizado en los pasos de negociación previa para decidir cuál algoritmo o implementación utilizar. Los patrones “Observer”, “Proxy” y “Client-Dispatcher-Receiver” podrían ser combinados con los patrones criptográficos para ofrecer comunicaciones entre procesos de forma transparente y segura, de manera que Alice venga a ser parte del “Forwarder” y Bob ser incorporado dentro del “Receiver”. El patrón “State” podría ser utilizado para proveer un comportamiento dependiente de los estados, tales como encender y apagar la seguridad del canal. El patrón “NullObject” puede ser utilizado para diseñar un transformación nula. El patrón “Reflection” puede ser utilizado para desacoplar la funcionalidad de la aplicación y la funcionalidad criptográfica. Aspectos de bajo nivel de la seguridad, tales como criptografía, pueden ser encapsulados en un “Security Access Layer” [YB97,16]. 3. PayPerClick: Un Sistema de Pago Electrónico Figura 4: Participantes del Comercio Electrónico A fin de ilustrar la aplicabilidad de este lenguaje de patrones, usaremos sus patrones criptográficos en un ejemplo grande, el diseño de una aplicación de comercio electrónico. Consideraremos únicamente los aspectos de seguridad de la aplicación, basados en criptografía. Los patrones de la Sección 4 enfocan aspectos particulares de este ejemplo. En la Figura 4 se muestran los tres principales entidades de una aplicación de comercio electrónico y el flujo de dinero y datos sensibles entre ellos [AJSW97]. El Broker usualmente es una banco o institución financiera como Visa o MasterCard. El Payee ( Vendedor ) puede ser un proveedor de acceso a Internet y los Payers ( Compradores ) son los clientes. Los Compradores solicitan dinero electrónico a los Brokers, los cuales pueden debitarlo de las tarjetas de crédito de los Compradores. Luego los Compradores pueden utilizar su dinero electrónico para comprar ( electrónicamente ) bienes en Internet. Ellos pueden solicitar recibos, los cuales son emitidos por el Vendedor. Los Vendedores solicitan los pagos a los Brokers, quienes pagan a los Vendedores por la venta de bienes a los clientes de los Brokers. Habitualmente, en este tipo de operatoria, el flujo de dinero real es desde los Brokers a los Vendedores. Dos buenas fuentes de información sobre sistemas de pago electrónico son [FD98, HY97]. Nuestra aplicación es un herramienta para la venta electrónica y la distribución en línea de documentos de hipertexto basados en el modelo de la Figura 4. Los documentos de hipertexto están accesibles a través de enlaces a páginas de HTML visualizadas mediante navegadores web. Este tipo de aplicaciones es útil para venta de libros en línea mediante enlaces en sus índices. Aquellos clientes interesados en una sección específica de un libro pueden comprar la información necesaria haciendo click sobre el hipertexto. A esta herramienta la llamaremos PayPerClick [BDR98]. El patrón Composite puede ser utilizado para calcular el valor del documento y de su huella electrónica o autenticador. Esta huella electrónica es un MDC (ver Apéndice A.1) de un árbol específico de un hiperdocumento utilizando una política transversal. La parte Compradora de la aplicación puede ser un applet Java o un plug-in de Netscape, el cual se comunica con su servidor web (Vendedor o Broker). Los Compradores usualmente tienen un monedero electrónico. Los Brokers emiten dinero electrónico el cual puede ser dividido en un cantidad fija de monedas electrónicas, las que son utilizadas para pagos. En las Figuras 5 y 6 se muestra cómo modelar una transacción de pago con PayPerClick como una instanciación de GOOCA. En este diagrama se utilizan dos patrones, Sender Authentication y Signature. El primero es usado para autenticar los pagos; el segundo para firmar el recibo. Figura 5: Estructura de pagos Figura 6: Dinámica de pagos 4. Patrones de servicios criptográficos Esta sección contiene patrones relacionados a los servicios criptográficos que dan soporte a los objetivos criptográficos [MvOV96] (resumidos en el Apéndice A). 4.1. Confidencialidad Contexto Alice desea enviar un mensaje sensible a Bob. Ella desea mantener este mensaje en secreto para Eve, de quien Alice sospecha que puede estar intentando leer el mensaje. Problema Cómo puede Alice enviar un mensaje a Bob de manera tal que para Eve le sea imposible leer su contenido..? Aplicabilidad - Cuando dos entidades necesitan compartir información con confidencialidad. - Cuando es necesario desacomplar la encripción de la comunicación o almacenamiento. Se debe cumplir con (Forces) - El costo de encripción no debe ser mayor que el valor intrínseco del mensaje a ser encriptado. - Eve no puede, en ninguna situación, ganar acceso al contenido del mensaje. Este es el principal requerimiento para el patrón. - El costo que debe pagar Eve para romper el mensaje debe ser mucho mayor que el valor atribuido al mensaje. Solución Este patrón soporta encripción y desencripción de datos. Alice y Bob previamente han acordado en un método criptográfico y en una clave o secreto compartido (si se utiliza criptografía de clave pública, Bob debe primero obtener la clave pública de Alice). Bob encripta el mensaje y lo envía a Alice. Alice desencripta el mensaje encriptado y recupera el mensaje original. Consecuencias - La encripción es lenta. La seguridad de la información encriptada está en la clave de encripción y la fortaleza de un criptosistema descansa en el secreto de una clave fuerte. De todos modos, a mayor longitud de la clave, mas lento es el algoritmo. - Eve no puede leer el contenido del mensaje, pero ella puede siempre reemplazar o modificar el mensaje encriptado o realizar algún otro tipo de ataque. - Errores en la transmisión o en el dispositivo de almacenamiento pueden potencialmente hacer imposible la recuperación del mensaje original. Factores de implementación - Claves secretas o privadas deben ser protegidas de copia o modificación no autorizada. - Es necesaria una infraestructura para distribuir claves. - Habitualmente se requiere algún tipo de detección de error para evitar pérdida de mensajes. - Se debe elegir el tipo de criptosistema a utilizar (de clave simétrica o secreta, de clave pública o híbrido). Ejemplo Cuando en PayPerClick, un Comprador hace una petición de dinero electrónico, envía al Broker su número de tarjeta de crédito encriptada. El Comprador encripta el número de su tarjeta de crédito con su clave de encripción y se la envía al Broker dentro de una petición de dinero. El Broker desencripta el número de tarjeta de crédito con su clave de desencripción y utilizar ese número para debitar el monto de dinero solicitado. Usos conocidos Un uso común de este patrón es la encripción de correo electrónico [Her97].