Teléfonos Android como dispositivos de cifrado versátiles Lic. Anna Roxana Fernández Gironés Tesis presentada como requisito parcial para optar al título de: Master en Ciencias de la Computación Tutores Msc. Alejandro Tamayo Castillo Dr. Miguel Katrib Mora Universidad de la Habana Facultad de Matemática y Computación La Habana, Cuba Junio, 2015 Dedicatoria A mi madre que tanto deseó este momento. Agradecimientos Muchas gracias a mi madre por apoyarme y aconsejarme en los momentos difíciles, por su inmensa dedicación de todos los días e infinito amor. Muchas gracias a mi abuela por su comprensión y cariño diario. Gracias a mi esposo, quién creyó en mí y me animó a seguir adelante. Gracias también a mis tutores por asesorarme en todas las etapas del presente trabajo. Muchas gracias a todos aquellos que, de una forma u otra, me ayudaron en este difícil camino. I Resumen Los teléfonos inteligentes son ya omnipresentes en las comunicaciones modernas. Al ser los dispositivos móviles más utilizados, resulta interesante considerar la capacidad de los mismos, en particular aquellos con Sistema Operativo Android, para aplicar mecanismos de cifrado de forma versátil. Este trabajo de diploma tiene como objetivo comprobar la factibilidad y analizar la seguridad y versatilidad de usar un teléfono Android como opción a los llamados Trusted Personal Devices (TPD), así como ilustrar cómo pudiera ser utilizado en la práctica. Para ello se hace uso de la tecnología TrustZone incorporada en el hardware de los últimos teléfonos móviles, la cual proporciona confianza directamente desde el hardware al igual que los Trusted Platform Module (TPM). Palabras Claves Android, Cifrado, Codificación, Dispositivo Móvil, Llave Segura, Plataforma de Confianza, Privacidad, Seguridad, Teléfono Inteligente, Zona Segura. II Abstract Smartphones are now ubiquitous in modern communications. As most used mobile devices, it is interesting to consider the potential thereof, particularly those with Android Operating System, to implement encryption / decryption mechanisms in a versatile way. This master thesis aims to test the feasibility, analyze security and versatility of an Android phones as option to called TPD and illustrate how it could be used in practice. For this purpose it is used The TrustZone technology built into the hardware of the latest mobile phones, which provides confidence directly from the hardware like the TPM. Keywords Android, Encryption, Decryption, Mobile Device, Secure Key Storage, Trusted Platform, Privacy, Security, Smart Phone, Trust Zone. III Tabla de contenido 1. 2 Introducción ............................................................................................................... 1 1.1 Motivación ............................................................................................................. 3 1.2 Problema ................................................................................................................ 4 1.3 Objetivos ................................................................................................................ 4 1.4 Retos ...................................................................................................................... 4 1.5 Estado del Arte ....................................................................................................... 4 1.5.1 Medios de Cifrado ........................................................................................... 5 1.5.2 Cifrado en Dispositivos Móviles ...................................................................... 6 1.5.3 Herramientas de Cifrado para Dispositivos Móviles ....................................... 7 Tecnologías................................................................................................................... 14 2.1 3 4 2.1.1 AES ................................................................................................................ 14 2.1.2 RSA ................................................................................................................ 19 2.2 Ambiente de Ejecución Seguro. Zona Segura ...................................................... 20 2.3 Trasmisión de la información de forma segura. SSL ............................................ 23 2.4 Autentificación del usuario .................................................................................. 26 2.5 Navegación por los ficheros cifrados. WebDAV .................................................. 27 Prototipo ...................................................................................................................... 29 3.1 Arquitectura ......................................................................................................... 29 3.2 Funcionamiento ................................................................................................... 30 3.3 Módulos ............................................................................................................... 37 3.4 Bibliotecas y Clases Utilizadas .............................................................................. 39 Resultados .................................................................................................................... 51 4.1 5 Algoritmos de cifrado ........................................................................................... 14 Casos de Uso ........................................................................................................ 52 Conclusiones ................................................................................................................ 55 Bibliografía .......................................................................................................................... 56 IV Listado de Figuras Figura 1-1 SPD de SPYRUS..................................................................................................... 6 Figura 1-2 BoxCryptor (Imágenes de Google Play) ............................................................... 8 Figura 1-3 Arquitectura de Herramientas de Cifrado para Dispositivos Móviles ................. 9 Figura 1-4 Compartir ficheros cifrados entre usuarios con estas herramientas ................ 10 Figura 1-5 Compartir ficheros cifrados con grupos. ........................................................... 11 Figura 1-6 DroidVault (Imágenes de Google Play).............................................................. 12 Figura 2-1 Cifrado por Bloques ........................................................................................... 15 Figura 2-2 Cifrado Continuo................................................................................................ 15 Figura 2-3 Ejemplo de Cifrado con ECB (Tomado de Wikipedia) ....................................... 16 Figura 2-4 Cifrado utilizando el modo CBC ........................................................................ 17 Figura 2-5 Descifrado utilizando CBC.................................................................................. 17 Figura 2-6 Cifrado utilizando CFB ....................................................................................... 17 Figura 2-7 Descifrado usando CFB ...................................................................................... 18 Figura 2-8 Ejemplo del esquema de Relleno PCKS7 ........................................................... 19 Figura 2-9 Zona Segura ....................................................................................................... 20 Figura 3-1 Arquitectura de CryptoDROID ........................................................................... 30 Figura 3-2 Contraseña para acceder a CryptoDROID ......................................................... 31 Figura 3-3 Certificados Generados por la CA de CryptoDROID .......................................... 31 Figura 3-4 Generando Certificados Digitales ...................................................................... 32 Figura 3-5 Interfaz de CryptoDROID ................................................................................... 32 Figura 3-6 Conectándose a CryptoDROID desde un Navegador Web ................................ 33 Figura 3-7 Alerta de Seguridad por Certificado Auto-Firmado........................................... 33 Figura 3-8 Descarga de Certificado Raíz ............................................................................. 34 Figura 3-9 Comparación de Huella Digital .......................................................................... 34 Figura 3-10 Instalación de Certificado ................................................................................ 35 Figura 3-11 Navegación Segura .......................................................................................... 36 Figura 3-12 Conexión con El servidor WebDAV de CryptoDROID ...................................... 36 Figura 3-13 Estructura de Fichero Cifrado con CryptoDROID ............................................ 38 V Figura 3-14 Composición de AndroidKeyStore hardware-based ........................................ 40 Figura 3-15 Composición de AndroidKeyStore software-based......................................... 41 Figura 3-16 Generación de las llaves públicas y privadas................................................... 42 Figura 3-17 Código que Genera las Llaves AES ................................................................... 42 Figura 3-18 Inicialización para cifrado con AES .................................................................. 42 Figura 3-19 Líneas para el Cifrado con RSA ........................................................................ 43 Figura 3-20 Generación de Certificado Raíz ....................................................................... 43 Figura 3-21 Uso de las clases para Generar el par de llave pública y privada.................... 44 Figura 3-22 Salva de Certificado raíz en formato PEM ....................................................... 44 Figura 3-23 Salva de llave privada ...................................................................................... 45 Figura 3-24 Transformación de la llave privada ................................................................. 46 Figura 3-25 Autenticando certificados con SSL .................................................................. 47 Figura 3-26 Métodos WebDAV .......................................................................................... 48 Figura 3-27 Formación de XML compatible con WebDAV ................................................. 48 Figura 3-28 Priemer Paso CryptoDROID ............................................................................. 49 Figura 4-1 Integración con las herramientas de Office ...................................................... 54 VI Listado de Tablas Tabla 4-1 Procesos Secuenciales (Tiempo en Segundos) ................................................... 51 Tabla 4-2 Procesos Paralelos (Tiempo en Segundos) ......................................................... 52 Introducción Página | 1 1. Introducción Hoy en día, gracias a los dispositivos móviles se ha hecho popular acceder a datos e información en cualquier momento y lugar. Un factor importante a considerar entonces, es la seguridad y confiabilidad de esos datos consultados, generados y almacenados, ya sea en el propio dispositivo o en la Nube Móvil (Mobile Cloud Computing, MCC) [1]. La Nube Móvil es un nuevo modelo computacional que combina la nube, la infraestructura de comunicación inalámbrica, los dispositivos de cómputo portables, los servicios de geolocalización y otras características. La diferencia con el paradigma de Computación en la Nube (Cloud Computing) es sutil. En la Nube Móvil, los actores protagónicos son los dispositivos móviles, y las aplicaciones y servicios se ajustan a sus características específicas como la resolución de pantalla, el ancho de banda, la capacidad de almacenamiento y procesamiento, los sensores, entre otros [2]. Existen muchas amenazas a la confiabilidad e integridad de la información almacenada en los dispositivos del usuario final. Algunas de esas amenazas están basadas en las propias Aplicaciones, la Web y la Red utilizada. También están las amenazas físicas como el robo o pérdida del dispositivo, permitiendo a personas ajenas disponer de la información que contiene [3] [4]. Los Proveedores de Servicios en la Nube (Cloud Service Providers, CSP) insisten en que sus servidores y los datos almacenados en ellos están lo suficientemente protegidos contra cualquier tipo de robo, argumentando que los datos contenidos en sus servidores están más seguros que los datos residentes en los dispositivos personales del usuario. Sin embargo, en la realidad los CSP también son víctimas de ataques como el incidente ocurrido con iCloud en el 2014 [5] o el de DropBox en el 2012 [6] donde se filtró información privada de los usuarios sin autorización. Por otra parte, las nubes no son infalibles y los datos almacenados en ellas no están exentos de extraviarse o modificarse, lo mismo a consecuencia de un fallo en la seguridad o algún error humano [7]. Además de estos problemas, la seguridad de los datos en el intercambio de la información a través de las Redes de Comunicación (Internet), que pueden llegar a ser hostiles, es un factor a considerar. Por estas y otras razones puede ser conveniente aplicar medidas adicionales de seguridad para proteger la información y los primeros controles para alcanzar esta meta son la autentificación (que el que accede sea verdaderamente quien dice ser) y el cifrado de la información (que la información solo la pueda ver quien tenga el secreto de cifrado) [4]. Esto no significa que se deban rechazar las bondades del almacenamiento en la nube que brindan los CSP como el bajo consto de un servicio que garantiza alta calidad y disponibilidad. Por tanto, hay que encontrar una variante que a la vez permita seguir utilizando estas facilidades y garantice la seguridad de los datos almacenados. Una Introducción Página | 2 solución puede ser codificar los datos utilizando un algoritmo de cifrado fuerte, antes de subirlos a la nube. De esta forma, ni el CSP ni alguien que logre obtener el dato almacenado tendrían acceso a su contenido. El problema entonces estaría en dónde almacenar el secreto para descifrar los datos y cómo realizar este proceso para que sea versátil y seguro. Si se almacena el secreto (una llave de cifrado) en la nube, se tendría el mismo problema. Existen soluciones empresariales para esto, dónde la solución consiste en que la empresa instala un servidor de llaves propio, y los datos viajan constantemente desde el CSP hacia este servidor a través de la red para realizar el descifrado [8] [9]. De esta manera el secreto (la llave privada en una Public Key Infrastructure, PKI) necesaria para descifrar la información, nunca sale fuera de la empresa ni se transmite por Internet. Existen numerosos dispositivos personales, en particular, aquellos que cumplen con fuertes demandas de seguridad, privacidad y confiabilidad, los cuales son denominados Dispositivos Personales de Confianza (TPD de su nombre en inglés). Para garantizar estos aspectos, los TPD presentan hardware dedicado a técnicas de cifrado [10]. Algunos de los teléfonos inteligentes más recientes con sistema operativo Android incorporan ya como parte de su hardware la posibilidad de almacenar este secreto de cifrado de forma segura, así como la posibilidad de realizar las operaciones de cifrado en lo que se denomina un entorno protegido que está separado del entorno de ejecución normal del dispositivo. Esta característica permitiría convertir estos dispositivos móviles en dispositivos de cifrado personal, realizando la codificación de los datos entre el CSP y el usuario. Note que los datos, una vez cifrados, pueden almacenarse lo mismo remotamente en el CSP que localmente en la memoria del dispositivo móvil; lo importante es cómo realizar el cifrado de forma tal que el secreto se proteja y que el proceso de cifrado no se realice fuera del entorno de ejecución seguro. En el presente trabajo de tesis se explorará la versatilidad y factibilidad de utilizar estos dispositivos con tal propósito. En la sección 1.1 del primer capítulo del presente trabajo, se introduce el motivo que originó la investigación de los dispositivos Android como dispositivos de cifrado versátiles y seguidamente en 1.2 se presenta el problema científico. A continuación en 1.3 se enumeran los objetivos que se quieren alcanzar. Luego, en la sección 1.4 se presentan los retos se deben superar. En la sección 1.5, se muestra una panorámica general de lo que está desarrollado en el campo de investigación que sigue este trabajo de tesis, a su vez, dividido también en secciones para su mejor comprensión. La primera sección 1.5.1 muestra los medios de cifrado existentes hoy en día, con sus diferencias, ventajas y desventajas. La siguiente sección 1.5.2 da una breve explicación del cifrado de los datos, en particular, las técnicas utilizadas en dispositivos móviles y brinda criterios de Introducción Página | 3 comparación entre ellas. En la última parte de este capítulo 1.5.3 se presentan las herramientas que cifran en los dispositivos móviles así como sus características principales. En el Capítulo 2 se presentan las tecnologías utilizadas para el desarrollo de este trabajo de diploma. Se explican y exponen los algoritmos de cifrado en la sección 2.1 la cual se divide un subsecciones para explicar los diferentes tipos de algoritmos de cifrado utilizados. En la sección siguiente, la 2.2, se presentan las nuevas tecnologías incorporadas en los teléfonos Android recientes, siendo estas, la pieza clave del desarrollo. En las secciones 2.3, 2.4 y 2.5 se brinda solución a los retos enunciados en el capítulo anterior. El Capítulo 3 está dedicado al prototipo de aplicación Android propuesto con el fin de permitir que el teléfono se comporte como un TPD. Para ello se ha dividido este capítulo en tres secciones. La primera de ellas 3.1 muestra la arquitectura de CryptoDROID (nombre que se le ha dado al prototipo). La segunda de las secciones de este capítulo 3.2 explica el funcionamiento del prototipo mientras que la siguiente sección 3.3 muestra los módulos y la implementación en concreto de CryptoDROID. La última de estas secciones 3.4 da un bosquejo por las bibliotecas que brinda Android y que fueron utilizadas. En el capítulo 4 se expone el resultado alcanzado, mostrándose la versatilidad de los teléfonos Android recientes para reemplazar a los TPD, así como algunos posibles usos del prototipo desarrollado, en ambientes que pueden ser o no protegidos. En el último capítulo 5 se brindan las conclusiones de este trabajo de tesis. 1.1 MOTIVACIÓN Integrar funcionalidades bajo un mismo dispositivo ha sido el gran éxito de los teléfonos inteligentes. Los teléfonos móviles de hoy, además de su funcionalidad básica (las comunicaciones por voz) juegan también los papeles de agendas personales, cámaras digitales, dispositivos de juego, dispositivos de almacenamiento y GPS entre otras muchas aplicaciones. Los teléfonos móviles son dispositivos de uso permanente que se han convertido prácticamente en una “extensión” de su propietario humano. Si pudiéramos utilizarlos además como TPD se les agregaría una nueva funcionalidad, cumpliéndose el deseo de utilizar un solo dispositivo para varias funciones y nuestra información en dichos dispositivos se mantendría segura. Utilizar un teléfono Android como TPD tiene muchos usos y posibles escenarios. En el entorno empresarial por ejemplo, un ejecutivo puede utilizar su móvil como TPD para codificar la información antes de subirla a la nube, o bien guardar directamente dicha información (ya codificada) en el teléfono. Otro posible escenario es el ámbito personal, dónde no queremos almacenar en la nube información privada o íntima sin cifrar para que no esté expuesta a fallos técnicos o ataques en los CSP. Introducción Página | 4 1.2 PROBLEMA ¿Es factible el reemplazo de los Dispositivos Personales de Confianza (TPD) por teléfonos inteligentes Android? 1.3 OBJETIVOS Con el fin de dar solución al problema plateado se presentan los siguientes objetivos específicos: 1. Analizar la viabilidad y versatilidad del uso de un teléfono inteligente Android actual como opción a un TDP, evitando con ello la necesidad de un dispositivo extra que requiera de un huésped para funcionar y que además implique un coste económico añadido. 2. Proponer un mecanismo para la gestión versátil de la información personal del usuario desde cualquier PC u otro dispositivo, garantizando la seguridad de la información utilizando un teléfono Android como TPD. Este trabajo está enfocado a los teléfonos inteligentes con sistema operativo Android por ser el sistema operativo predominante en el mercado y por presentar las APIs necesarias para la implementación de aplicaciones que utilizan el cifrado por hardware y por consiguiente la Zona Segura. 1.4 RETOS Para cumplir con estos objetivos, es necesario resolver los siguientes tres problemas fundamentales: 1. Establecer los mecanismos de cifrado de la información y garantizar el almacenamiento de la llave privada de forma segura en el propio dispositivo Android. 2. Garantizar la trasmisión de los datos de forma segura entre el dispositivo Android y el dispositivo final (cualquier dispositivo que tenga un navegador web estándar, como una PC u otro dispositivo móvil), asegurando el canal de comunicación. 3. Garantizar la autentificación del usuario en el dispositivo final. La propuesta del presente trabajo, incluye soluciones para cada uno de estos retos, las cuales serán detalladas posteriormente en las secciones del Capítulo 2 . 1.5 ESTADO DEL ARTE El medio más usado para transportar información en nuestros días, sin contar la Nube, son los dispositivos USB de almacenamiento externo. La mayoría de ellos no presentan protección de la información que contienen. Aquellas memorias USB que sí presentan algún tipo de protección se les llama Secure USB Flash Drive. La protección en estos dispositivos consiste en la autentificación del usuario y el cifrado/descifrado de los datos Introducción Página | 5 que contienen. Teniendo en cuenta estas dos funcionalidades, existen tres tipos de implementación que dan lugar a estas memorias USB seguras: software-based, hardwarebased partitioning y hardware-based [11]. La adopción de una u otra de estas variantes depende de las necesidades del usuario y de los criterios prioritarios que este defina, tales como, grado de seguridad o valor económico. 1.5.1 Medios de Cifrado Software-based realiza las funciones de autentificación y cifrado/descifrado utilizando solamente software que ejecuta fuera del dispositivo (en un hospedero). Existe una gran variedad de éste software de cifrado en el mercado (FolderLock1, Dekart Keeper2, CryptoForge3, Advanced Encryption Package Pro4, etc.). Están disponibles para varias plataformas y presentan una amplia variedad de funcionalidades que van desde mecanismos de respaldo y generadores de contraseñas seguras hasta limpiadores de historial. Algunos de ellos tienen además, la facilidad de enviar ficheros que se descifran por si solos con el fin de poder compartir datos sensibles por redes inseguras. Estos softwares funcionan hospedados en un dispositivo de almacenamiento, como una memoria USB o un disco duro de la PC, y cifran una parte de él. Por lo general montan una unidad virtual y es en dónde el usuario guarda su información una vez abiertos. Cuando se cierran nuevamente, la unidad virtual se desmonta. La forma de acceder a los datos almacenados en dicho dispositivo es a través de una contraseña que provee el usuario. Su debilidad es que requieren de un software y un dispositivo hospedero para acceder a dichos datos, y esto está expuesto a tampering, es decir, un atacante puede modificar el software o el dispositivo hospedero para obtener la contraseña y por consiguiente, hacerse con los datos descifrados. Una ventaja que presentan es el bajo costo económico que conllevan, ya que algunas veces puede llegar a ser gratuito o precios menores a 50 euros. Otro aspecto positivo es su facilidad de uso. Hardware-based partitioning soporta la división del dispositivo físico en múltiples particiones teniendo particiones para los datos que necesitan protección y otras para los datos que no son sensibles. Muchos de los dispositivos que usan esta modalidad son capaces también de cifrar por ellos mismos los datos que contienen en estas particiones seguras. Esta funcionalidad se logra con un chip que tienen incorporado. 1 http://www.newsoftwares.net/folderlock/ http://www.dekart.com 3 http://www.cryptoforge.com 4 http://www.aeppro.com/products/aep.shtml 2 Introducción Página | 6 Hardware-based cifra/descifra la información dentro del dispositivo USB con una llave que es generada y guardada dentro de él. Estos son dispositivos USB más sofisticados, llamados dispositivos USB de confianza o Secure Pocket Drive (SPD), como los de la compañía SPYRUS5 que cargan un sistema operativo propio para ejecutar directamente en la computadora anfitriona, de tal modo que se pueden hacer las operaciones necesarias con la seguridad de no dejar rastros al concluir. Pueden apreciarse alguno de ellos en la Figura 1-1. Figura 1-1 SPD de SPYRUS Estos dispositivos brindan varias ventajas. La primera de ellas es la gran variedad que existen en el mercado. Variedad en cuanto a modelos (USB, SSD) y en cuanto a capacidades (16-256 Gb), incluso existen algunos modelos que tienen una interfaz USB y presentan el hardware de cifrado en él, pero se puede cambiar su memoria interna (microSD) tantas veces como se quiera. Otra ventaja que promueven, y es la que ha hecho populares a estos dispositivos, es que la llave de cifrado se guarda en el hardware del mismo y nunca sale de este, lo que los hace altamente confiables. Sin embargo, la desventaja principal es que se necesita siempre de un dispositivo anfitrión para procesar la información por lo que entonces se corre el riesgo de que se hackee el driver o software que ejecuta en el dispositivo hospedero permitiendo acceder a la información segura. 1.5.2 Cifrado en Dispositivos Móviles Hoy en día tenemos numerosas técnicas de cifrado para proteger la información y los datos como por ejemplo: Cifrado de disco duro (Full Disk Encryption, FDE), utilizada por iOS y BlackBerry, Cifrado de disco virtual (Virtual Disk Encryption, VDE) y Cifrado de ficheros o carpeta (File / Folder Encryption, FE) usada por Windows Phone y Android [4]. 5 http://www.spyrus.com Introducción Página | 7 El cifrado de disco (FDE) tradicionalmente trabaja bajo el sistema de ficheros para proveer codificación y descodificación instantánea para todas las tareas de lectura/escritura en el dispositivo. Por esta razón, la llave de cifrado debe de estar accesible para el sistema de ficheros y en consecuencia si el dispositivo está en el estado desbloqueado, entonces la llave y los datos son vulnerables. Además, como FDE cifra tanto los ficheros del usuario como los ficheros del sistema operativo, existe una mayor probabilidad de hackear la llave, ya que el hacker conoce tanto el texto plano (bloque donde se encuentran datos siempre iguales del Sistema Operativo, los cuales no varían por dispositivos) como el texto cifrado (de estos bloques del Sistema Operativo) y puede utilizar técnicas conocidas y documentadas en la literatura para obtener la llave (Know-plaintext attack) [12]. Si se trabaja en un ambiente con computadoras, estas se pueden poner en suspensión o apagarse para proteger la llave. Con los teléfonos inteligentes sin embargo, es imposible pues es necesario mantener las funcionalidades básicas de comunicación. En [13] proponen una solución para proteger la llave en FDE. El cifrado de fichero o carpeta (FE) disminuye las vulnerabilidades de FDE hasta que el usuario se autentifica satisfactoriamente y los datos son descodificados. Pero una vez que esto ocurre, cualquier proceso que se esté ejecutando en el dispositivo (como puede ser un virus) con acceso a los datos del usuario, puede tener entonces acceso a la información. Esto sin contar la pérdida o robo de la contraseña de autentificación [4] con un keylogger o un malware que adquiera una copia de la llave de la memoria del dispositivo (en soluciones en que el almacenamiento de la llave es por software). 1.5.3 Herramientas de Cifrado para Dispositivos Móviles Existen ya algunas herramientas para cifrado en teléfonos con sistema operativo Android. Estas pueden dividirse en dos grupos: − Herramientas de cifrado local, dónde la aplicación de cifrado ejecuta en el teléfono y los datos se almacenan en el mismo (ejemplo Boxcryptor6, Cryptonite7). − Herramientas de cifrado remoto, dónde la aplicación de cifrado ejecuta en el teléfono pero los datos se almacenan en la nube. Este grupo puede subdividirse en dos: aquellas herramientas dónde el almacenamiento remoto es un servicio nativo especializado (ejemplo SpiderOak8 y Wuala9) o aquellas que reutilizan servicios de almacenamiento existentes (ejemplo Boxcryptor, Cryptonite) como Google Drive, Dropbox, SkyDrive, etc [14]. 6 https://www.boxcryptor.com http://code.google.com/p/cryptonite 8 https://spideroak.com 9 https://www.wuala.com 7 Introducción Página | 8 La mayoría de estas herramientas utilizan el sistema de archivos EncFS10, diseñado para crear una capa de abstracción entre un sistema de archivos virtual, dónde el usuario almacena sus datos y el sistema de archivos real dónde se almacenan los ficheros ya encriptados [15]. EncFS permite utilizar como sistema de archivos real, tanto el disco duro local del dispositivo como los servicios en la nube (Google Drive, Dropbox, SkyDrive, etc). Para el usuario final, el sistema de archivos virtual es transparente, ya que se visualiza y accede como un “disco duro” más conectado al dispositivo [16]. En la Figura 1-2 se muestra la interfaz de Boxcryptor y se puede aprecia su funcionamiento. Note que es necesario registrarse en Boxcryptor para poder utilizarlo. También es necesario proporcionar una contraseña (PIN) para poder acceder a los datos cifrados ya sea en el propio dispositivo o en los CSP. Figura 1-2 BoxCryptor (Imágenes de Google Play) Estas herramientas utilizan para cifrar los datos Advanced Encryption Standard (AES) con diferentes modalidades (CBC11, CFB12, XTS13) (los algoritmos de cifrado se explicarán más detalladamente en la sección 2.1) para cifrar los datos. Algunas de ellas, añaden un nivel de seguridad adicional, generando una llave AES aleatoria para cada fichero y esta se cifra a su vez con Rivest Shamir Adleman (RSA). Utilizando RSA+AES se mejora la seguridad, ya que si un hacker se hace con la llave AES que se utilizó para cifrar el fichero, solo habrá obtenido acceso a dicho fichero y no a los restantes. Pero esta mejora conlleva a proteger 10 FUSE-based cryptographic filesystem Cipher Block Chaining 12 Cipher Feedback 13 Xor encrypt xor based tweaked codebook mode with ciphertext stealing 11 Introducción Página | 9 fuertemente el bloque cifrado con RSA, utilizando una llave de 4096 bits mínimo (antes de Android 4.3 solo se podía utilizar hasta 2048) y un algoritmo de relleno (padding) criptográficamente fuerte, ya que éste entonces sería el objetivo fundamental del hacker (si se obtiene de alguna forma la llave privada, se tendría acceso a todos los datos cifrados). Pero como se puede lograr que el bloque RSA siempre contenga información aleatoria entonces le sería muy difícil a un hacker realizar ataques conocidos (adaptive chosen ciphertext attacks) [17]. Utilizar el algoritmo RSA para cifrar todo un fichero no sería conveniente ya que el proceso de descifrado de RSA es lento [18] y además se expondría la llave privada a mayores ataques. Todas estas herramientas tienen una característica en común: la aplicación encargada de cifrar o descifrar ejecuta donde mismo el usuario va a acceder a los datos. Esto puede apreciarse en la Figura 1-3 que representa la arquitectura de estas herramientas. Servidores de la herramienta Cryptonite / Boxcryptor / etc. Google Drive / Dropbox SkyDrive Motor de Cifrado Llave Privada Datos / Wifi UI Aplicación Fichero 1 Fichero 2 Fichero 3 . . . . Fichero n Motor de Cifrado Llave Privada UI Aplicación Fichero 1 . Fichero n Otros Dispositivos Personales Figura 1-3 Arquitectura de Herramientas de Cifrado para Dispositivos Móviles Si se quisiera compartir los datos cifrados almacenados en la nube, entre un dispositivo Android y una PC de escritorio, habrá que compartir la llave privada entre ambos dispositivos e instalar la herramienta también en la PC de escritorio. Pero independientemente de que la llave privada se pueda proteger por contraseña, al tener que estar almacenada en todos los dispositivos que acceden a los datos cifrados (hablamos de diferentes sistemas operativos, diferente software y distintas características de seguridad y protección) se amplían entonces las posibilidades de hacking. Introducción Página | 10 La solución podría ser entonces que cada uno de estos dispositivos (incluyendo la PC de escritorio) brindase por hardware un mecanismo para el almacenamiento seguro de la llave privada y la ejecución segura de las operaciones de cifrado, similar al TrustZone de Android (se verá con detalle en la sección 2.2). Pero en la práctica, actualmente sólo un conjunto pequeño de dispositivos brindan esta característica, por lo que las herramientas anteriores están expuestas por diseño a múltiples tipos de ataques documentados en la literatura. Muchas de estas herramientas brindan además soporte para compartir datos cifrados entre usuarios. Por ejemplo, un usuario A solicita la llave pública del usuario B al servidor de claves de la aplicación (por ejemplo, Boxcryptor) con el fin de codificar la llave con que se cifró el archivo que quiere compartir con el usuario B. El usuario A escribe junto a los datos del fichero cifrado la nueva llave cifrada y luego el proveedor de almacenamiento en la nube sincroniza el archivo modificado ya cifrado. El usuario B, entonces, utiliza su llave privada para descifrar la llave del archivo que le envió A y así poder tener acceso a su contenido. En la Figura 1-4 se hace una representación de esta funcionalidad. Servidores de la Herramienta 1 2 A A Cifra el fichero y escribe en el la llave cifrada con la llave pública de B B usa su llave privada para descifrar el fichero compartido por A B 3 4 Proveedor de Almacenamiento Figura 1-4 Compartir ficheros cifrados entre usuarios con estas herramientas Si un archivo se comparte con varios usuarios a la vez (que no pertenecen a un grupo) entonces se sigue este mismo proceso pero se codifica la llave con que se cifró el fichero con cada una de las llaves públicas de los usuarios con quien se comparte el archivo. Las diferentes llaves cifradas se escriben todas en el fichero compartido, junto a los datos del fichero, también cifrados. Eso aumenta considerablemente el tamaño del fichero y complejiza la administración de las llaves [19]. Introducción Página | 11 Además de compartir archivos cifrados entre usuarios, algunas de estas herramientas también comparten ficheros codificados con Grupos, lo que las hace muy populares en el entorno empresarial. La Figura 1-5 muestra el mecanismo utilizado. Un usuario que quiera compartir contenido cifrado con un grupo, sigue prácticamente la misma lógica que se utiliza para compartir entre usuarios. El usuario A solicita al servidor de llaves de la aplicación la llave pública del Grupo con quién se quiere compartir los datos. Luego cifra el archivo a compartir con la llave pública del grupo y a continuación escribe en el archivo cifrado la nueva llave codificada. El proveedor de almacenamiento en la nube sincroniza el archivo modificado. Luego un miembro del grupo que quiera tener acceso a ese archivo tendría que pasar por varios pasos. Primero utilizar su llave privada para descifrar y tener acceso a la llave de membresía del grupo. Posteriormente utilizaría la llave de membresía del grupo para descifrar la llave privada del grupo y utilizaría esta a su vez para tener acceso a la llave del archivo cifrado. Finalmente, teniendo esta llave se descifraría el archivo y se tendría acceso a su contenido. Claro está, que todos estos pasos son transparentes para el usuario. Servidores de la Herramienta Un usuario B miembro del grupo con el 5 que compartió el fichero utiliza su Llave Privada para Descifrar la llave de Membresía del Grupo 1 2 A A Cifra el fichero y escribe en el la llave cifrada con la llave pública del grupo 6 7 B utiliza la llave de membresía para descifrar la Llave Privada del Grupo B utiliza la llave privada del Grupo para descifrar la Llave del Fichero compartido B 3 4 Proveedor de Almacenamiento Figura 1-5 Compartir ficheros cifrados con grupos. Para poder tener disponibles estas funcionalidades los servidores de estas herramientas guardan todas las llaves implicadas en estos mecanismos, las privadas, las públicas ya sean de usuarios o de grupos. Por supuesto, las llaves no se guardan en texto plano, las llaves están cifradas con la contraseña del usuario o las claves de membresía de grupo. Una herramienta interesante que utilizan los dispositivos Android para cifrar y descifrar los datos es DroidVault [20] (se puede apreciar en la Figura 1-6). DroidVault garantiza a los dueños de datos sensibles la protección de los mismos en dispositivos Android Introducción Página | 12 potencialmente inseguros. Esta herramienta enfoca a servidores de datos remotos (empresas) como los dueños de los datos sensibles. Estos datos sensibles son compartidos en los dispositivos móviles de los usuarios finales (empleados de la empresa) que se definen como los usuarios de los datos. Esta herramienta hace uso de la nueva tecnología incorporada en los teléfonos inteligentes recientes para protección de las llaves de cifrado (sección 2.2) al igual que la propuesta de la presente tesis que se mostrará en el Capítulo 3. DroidVault es un sistema diseñado por partes que está separado del sistema operativo y presenta tres componentes fundamentales: El módulo de procesamiento de la información, un módulo puente y el módulo de entrada y salida de los datos hacia y desde la pantalla del dispositivo. El módulo de procesamiento de la información es el encargado de mantener un canal de comunicación seguro con el servidor de datos con el fin de intercambiar información y de procesarla. El módulo puente facilita las comunicaciones entre el sistema operativo y el módulo de procesamiento, y el último módulo es el encargado de mostrar los datos en la pantalla al usuario y de recoger cualquier dato producido por el mismo. Figura 1-6 DroidVault (Imágenes de Google Play) Esta herramienta presenta además cuatro servicios importantes para proteger los datos en todo momento: seguridad en la comunicación con la red, seguridad en el almacenamiento, seguridad en la entrada y salida de los datos y seguridad en el ambiente de procesamiento de los datos. Para obtener la seguridad en el intercambio con la red DroidVault implementa las comunicaciones utilizando SSL con las dos fases que conlleva, cifrado y trasmisión de los datos. DroidVault cifra la información en el mundo seguro, preparándola para ser enviada Introducción Página | 13 (El mundo seguro es un entorno de ejecución confiable que traen algunos de los teléfonos inteligentes actuales y que será comentado en la sección 2.2 de este trabajo de tesis). Para este cifrado utiliza diferentes tipos de APIs criptográficas con algoritmos simétricos y asimétricos presentes en el mundo seguro. Esta herramienta además presenta un certificado en su almacenamiento seguro para construir una cadena de confianza con otros certificados digitales y así autenticar servidores remotos. Para la fase de transmisión de los datos cifrados utiliza llamadas al sistema operativo a través del módulo puente. Las respuestas obtenidas son verificadas por la herramienta. El ambiente seguro solo provee un almacenamiento limitado, por tanto DroidVault necesita utilizar el sistema de ficheros de Android para poder guardar los datos sensibles y garantizar el almacenamiento. Para ello DroidVault cifra los datos y utiliza llamadas de escritura y lectura del sistema de ficheros el cual guarda la información completamente cifrada. A diferencia de los servicios anteriores donde se le da amplia participación a Android en las acciones realizadas por DroidVault, en el caso de la entrada y salida de información por la pantalla o el teclado del dispositivo móvil, la herramienta toma el control por completo de estas partes del dispositivo incorporando dentro de ella controladores (drivers) propios para la pantalla y el teclado. Con el fin de asegurar el procesamiento de los datos DroidVault cifra los datos sensibles que provienen y son enviados a los servidores de los datos. Una vez cifrada la información DroidVault utiliza metadatos para el procesado de descifrado los cuales son a su vez cifrados y guardados en el sistema de ficheros. DroidVault como la mayoría de las herramientas existentes, también se puede utilizar con proveedores de almacenamiento en la nube como DropBox. La propuesta de este trabajo de tesis (CryptoDROID) presenta semejanzas con esta herramienta. La más evidente, es la utilización de la Zona Segura. DroidVault, no ve al usuario como dueño del teléfono móvil, como dueño también de los datos. Para DroidVault los dueños de los datos son las empresas que comparten dichos datos con los teléfonos inteligentes de sus trabajadores. Es decir, los datos se almacenan en la empresa, y aquellos que se extraen temporalmente de ese entorno, se aseguran en DroidVault, pero una vez que se finaliza su uso, se devuelve el dato actualizado a la empresa y se elimina del dispositivo móvil. Es aquí dónde radica la diferencia fundamental con CryptoDROID, pues en este último, el dueño de los datos es el dueño también del dispositivo móvil. En CryptoDROID, el dispositivo móvil actúa como servidor de datos y caja fuerte. Tecnologías Página | 14 2 Tecnologías Este capítulo está compuesto por varias secciones con el fin de aclarar las tecnologías utilizadas en la implementación de CryptoDROID y el lector pueda entender fácilmente los aspectos del desarrollo del prototipo presentado. Estas tecnologías utilizadas, son las respuestas a los retos encontrados durante el desarrollo de este trabajo de tesis. Cada una de ellas se explica de forma general y además se expone el uso específico que se le da en CryptoDROID, con el fin de alcanzar los objetivos propuestos, teniendo en cuenta las limitantes que presentan y adaptándolas al entorno de uso del prototipo implementado. 2.1 ALGORITMOS DE CIFRADO Existen actualmente varios mecanismos de cifrado que se dividen en dos grupos: − Cifrado simétrico dónde la misma llave se utiliza para codificar y decodificar la información. Ejemplos de este tipo de cifrado son Data Encryption Standard (DES), Triple DES, AES, Rivest Cipher (RC2), RC4, entre otros. − Cifrado asimétrico existen dos llaves conocidas como llave pública y llave privada. La llave pública se utiliza para codificar la información y la llave privada, que es secreta, para decodificarla. Como ejemplos tenemos RSA, Digital Signature Algorithm (DSA). En las siguientes subsecciones se explicarán solamente AES y RSA que son los algoritmos que se utilizaron en este trabajo. 2.1.1 AES En criptografía, AES es un estándar [21] para cifrar datos, de llave simétrica, basado en el principio de diseño red de sustitución-permutación (Substitution-Permutation Network, SPN). Este principio consiste en tomar un bloque de texto plano y dividirlo en sub bloques a los cuales se les aplicarán permutaciones (P-boxes) y sustituciones (S-boxes) que vienen dadas por el intercambio de posición de estos bloques y por aplicar la operación XOR con la llave respectivamente. Como resultado, se obtiene el bloque de entrada cifrado. En el caso del descifrado, se hacen las mismas operaciones pero en orden inverso. AES tiene un tamaño de bloque fijo, 128 bits, que constituyen el tamaño de bloque a cifrar y el tamaño de la salida cifrada, mientras que la llave puede tener un tamaño de 128, 192 y 256 bits. Esta diferencia de bits implica diferente número de iteraciones del algoritmo. En el caso de 128 bits se harían 10 iteraciones mientras que con 192 y 256 bits se ejecutarían 12 y 14 iteraciones respectivamente [21]. La estructurada de datos con la cual trabaja AES es una matriz de bytes de 4x4 llamada state, que se inicializa con el bloque de 128 bits (16 bytes) de texto claro que se le pasa al algoritmo como entrada. Sobre esta matriz se aplican las iteraciones del algoritmo dónde Tecnologías Página | 15 cada una de ellas se encarga de aplicar diferentes tipos de sustituciones y permutaciones de su principio de diseño. AES es rápido tanto en software como en hardware [22], relativamente fácil de implementar y es muy popular por ser difícil de romper con fuerza bruta. Modos de Operación utilizados Los modos de operación son técnicas que se utilizan para mejorar o adaptar un algoritmo de cifrado. Estos modos dependen de la forma en que se cifraran los datos, ya sea por bloques de bits (block cipher) como se muestra en la Figura 2-1, o sin divisiones, cifrándose los bits uno a uno continuamente (stream cipher) como se muestra en la Figura 2-2. Figura 2-1 Cifrado por Bloques El tamaño típico de los bloques de cifrado es 64 o 128 bits. El tamaño de bloque que se usa con AES es 128 bits. Figura 2-2 Cifrado Continuo Existen varios modos de cifrado para algoritmos simétricos: − Electronic Code Book (ECB) que es el modo básico utilizando un cifrado por bloques (block cipher), pues toma los bloques de datos y los cifra independientemente con la misma llave, permitiendo paralelización. Este modo no se recomienda debido a que dos bloques con los mismos datos producen el mismo dato cifrado y el mismo patrón del dato, lo que facilita el hacking. Esto puede apreciarse en las Figura 2-3 dónde se muestra una imagen sin cifrar primeramente, luego la imagen cifrada usando ECB y finalmente la imagen cifrada con otro modo de operación. Tecnologías Página | 16 Figura 2-3 Ejemplo de Cifrado con ECB (Tomado de Wikipedia) − Cipher Block Chaining (CBC) Elimina la desventaja del modo ECB ya que presenta un vector de inicialización diferente por cada bloque cifrado lo que implica que el cifrado de datos iguales resulta en datos cifrados diferentes. Un vector de inicialización (IV) es una cadena aleatoria de 16 bytes que se utiliza, aplicando un XOR junto a la llave, para generar una nueva llave con la que se cifra el bloque. Existen técnicas para generar IV, aunque básicamente el IV puede ser una cadena aleatoria de bytes. En el caso de CBC, cada bloque utiliza un IV diferente, generado de forma encadenada. La entrada del algoritmo AES-CBC sería una llave y un IV, que se utiliza para cifrar el primer bloque, y el resultado cifrado sería el IV del siguiente bloque. Este modo garantiza que un texto con los mismos caracteres (ejemplo, todos 0) genere una codificación arbitraria de caracteres, dificultando el hacking. La desventaja que presenta es que el cifrado debe ser hecho de forma secuencial pues el cifrado de un bloque depende del bloque anterior. CBC es uno de los modos más populares y uno de los seleccionados en la implementación de nuestro prototipo. Hay que resaltar que para descifrar el contenido, se requiere conocer además de la llave, cual fue el IV utilizado. El IV una vez que se utiliza puede ser público, ya que su único objetivo es saltear un poco el resultado cifrado. Tecnologías Página | 17 Figura 2-4 Cifrado utilizando el modo CBC En las Figura 2-4 y 2-5 se muestra el cifrado y descifrado respectivamente, utilizando este modo. Figura 2-5 Descifrado utilizando CBC − Cipher Feedback Mode (CFB) Es parecido a CBC pues también utiliza un vector de inicialización, pero el proceso es algo diferente. Se toma el IV y se procede a la codificación de la llave. Al resultado se le aplica un XOR con el bloque sin cifrar y se obtiene el bloque cifrado. Este bloque cifrado se utiliza como IV para la codificación del bloque siguiente. Las Figuras 2-6 y 2-7 muestran el proceso de cifrado y descifrado con este modo. CFB al utilizar un stream cipher no necesita de padding. Este modo de operación junto con CBC son los utilizados en el presente prototipo. Figura 2-6 Cifrado utilizando CFB Existen otras variantes de modos de operación, algunas que se derivan de estas formas principales y otras variantes nuevas. Tecnologías Página | 18 Figura 2-7 Descifrado usando CFB Esquemas de Relleno El algoritmo AES, cifra bloques exactos de 128 bits. Por tanto, para cifrar un texto largo, habría que dividir este en pedacitos de 128 bits. Pero el texto no tiene por qué coincidir exactamente y su tamaño ser múltiplo de 128, por lo que el último bloque requerirá de un procesamiento adicional conocido como esquema de relleno (padding). El esquema de relleno en un cifrado por bloques resuelve el problema de que el tamaño de los datos en claro no sea múltiplo del tamaño de bloque del algoritmo de cifrado. Para ello, se rellena el último bloque de cifrado con datos que siguen cierto patrón. Existen varios sistemas de relleno como por ejemplo Zero Padding o Bit Padding. El primero adiciona cuantos 0 sean necesarios al final del bloque, mientras que el segundo añade un bit “1” al final del texto y luego tantos 0 como sean necesarios. El problema de este esquema de relleno, es que es criptográficamente débil y está sujeto a ataques conocidos. En la segunda guerra mundial, los aliados lograron romper el código enigma, cifrado utilizado por el ejército Alemán, al darse cuenta que cada mensaje cifrado finalizaba con “Heil Hitler!” o empezaba con “Spruchnummer” (número de mensaje). Conocer la forma de parte del texto claro, puede ayudar a un atacante a romper el cifrado y obtener la llave. Un esquema de relleno más fuerte, es PCKS7 que es el que se utilizará en la presente propuesta junto a AES. Consiste en llenar bytes completos con el valor de la cantidad de bytes a llenar. La Figura 2-8 representa este esquema de relleno. Si fuese necesario rellenar con 2 bytes entonces la línea 2 de la figura 2-3 sería la indicada. Tecnologías Página | 19 Figura 2-8 Ejemplo del esquema de Relleno PCKS7 De los modos AES anteriormente expuestos, algunos como AES-CBC requieren obligatoriamente un esquema de relleno por utilizar block cipher y otros como AES-CFB no lo requieren ya que utilizan un stream cipher. Uno de los objetivos de las herramientas de cifrado, consiste en que el tamaño del texto claro sea exactamente igual al tamaño del texto cifrado. Una técnica conocida es utilizar un modo de operación más resistente a ataques (por ejemplo AES-CBC) para los bloques enteros, y en el caso del último bloque, para no requerir un esquema de relleno, utilizar AES-CFB que es más propenso a ataques, pero no requiere espacio adicional. Claro, la llave y el vector de inicialización se requieren también, pero son elementos que no se guardan junto al fichero, ya que la llave se genera a partir de una clave que se sabe el usuario y el IV puede autogenerarse según metadatos existentes. 2.1.2 RSA RSA es un algoritmo de cifrado asimétrico que presenta dos llaves, una pública y una privada. La llave pública consiste en dos números (n, e) dónde 𝑛 = 𝑝 ∗ 𝑞 siendo p y q números primos grandes no públicos. Se escoge e tal que 1 < 𝑒 < 𝑛, 𝑃𝐺𝐶𝐷(𝑒, 𝜑(𝑛)) = 1 . Siendo 𝜑(𝑛) = (𝑝 − 1) ∗ (𝑞 − 1) y PGCD el mayor divisor común. La llave privada por su parte es d y se obtiene 𝑑 = 𝑒 −1 (𝑚𝑜𝑑 𝜑(𝑛)). El proceso de cifrado y descifrado están representados en la ecuaciones siguientes. 𝐸(𝑚) = 𝑚𝑒 (𝑚𝑜𝑑 𝑛) = 𝑐 𝐷(𝑐) = 𝑐 𝑑 (𝑚𝑜𝑑 𝑛) = 𝑚 Para romper RSA a partir de su llave pública (única técnica conocida hasta ahora) se necesita factorizar n y para factorizar un número de b bits se tarda 𝛩(2𝑐𝑏 1/3 𝑙𝑜𝑔 𝑏 2/3 ). RSA presenta esquemas de relleno al igual que AES. Esto es muy importante para proteger el algoritmo de ataques llamados oráculos y de sustitución [23]. En ningún caso es recomendable rellenar con ceros o inventarse un esquema de relleno propio, ya que estos deben probarse y no todos los existentes son seguros. Por ejemplo, existen RSA-SAEP+ (Simplified Asymmetric Encryption Padding) y RSA-OAEP (Optimal Asymetric Encryption Padding). Este último es el más fuerte actualmente y se usa en PKCS#1, que es el esquema que se utilizará en el prototipo. Tecnologías Página | 20 2.2 AMBIENTE DE EJECUCIÓN SEGURO. ZONA SEGURA Algunos de los teléfonos inteligentes Android más recientes tienen en su hardware una característica llamada Zona Segura (ARM TrustZone®), la cual tiene la tarea de crear un entorno seguro separado del Sistema Operativo al cual los atacantes no tienen acceso. Se llama Entorno de Ejecución Confiable (Trusted Execution Environment, TEE). Esta tecnología se utiliza para proveer confianza en el almacenamiento de la llave así como operaciones de cómputo seguras [24] [25]. La zona segura está basada en dos ambientes separados completamente, llamados worlds cuyo aspecto fundamental es que usan recursos de software y hardware separados. El primero normal world es el conocido hasta ahora y es en el que funcionan el sistema operativo y las aplicaciones. El segundo mundo es nuevo y se ha denominado secure world. Las aplicaciones en este mundo son llamadas Truslets. En la Figura 2-9 se muestra esta separación de ambientes. Figura 2-9 Zona Segura En el mundo seguro, corre un sistema operativo llamado secure world OS y los Truslets deben cumplir ciertos requisitos con el fin de proveer servicios de seguridad especiales tales como el almacenamiento seguro de la llave. Un ejemplo de estos requisitos es que el TEE debe permitir que las aplicaciones ejecuten separadas, lo que asegura que aplicaciones maliciosas no puedan acceder o modificar el código o los datos de otra aplicación. Otro requerimiento fundamental es el almacenamiento seguro de los datos para proteger el secreto y la integridad de los datos binarios que representan las aplicaciones, así como los datos que estas utilizan mientras no están en ejecución [24]. El sistema operativo Android ya implementa el almacenamiento por hardware de la llave de cifrado en los dispositivos móviles que ya tienen Zona Segura (por ejemplo, la línea de Tecnologías Página | 21 teléfonos Nexus de Google) y que además presentan los controladores para comunicarse con ella. Android brinda también una API para su utilización de la cual pueden servirse las aplicaciones. En los teléfonos actuales que disponen de Zona Segura, toda la memoria del sistema está separada, incluyendo la RAM y los registros de los CPUs. Una parte dedicada al mundo normal y otra para el mundo seguro. Esto significa que el mundo normal no puede acceder a la memoria del mundo seguro. La Zona Segura también tiene un procesador dedicado al cifrado y almacenamiento de las llaves que solo puede ser accedida por el mundo seguro [24]. Una de las características fundamentales de la Zona Segura es el bit de seguridad en el bus de comunicaciones [25]. El procesador ARM tiene un bus de comunicación llamado AXIbus que se usa por el procesador principal para comunicarse con los periféricos. Estos periféricos pueden estar localizados en el mismo chip o fuera. Cuando múltiples sistemas (el mundo seguro y el mundo normal) están en un mismo chip, este bit seguro se añade al bus para poder comunicar a los periféricos que la transacción que están recibiendo es del mundo seguro o del mundo normal. Todos los periféricos deben chequear el estado del bit para asegurarse de no dejar escapar información del mundo seguro al normal. Otro aspecto del hardware de la Zona Segura es la separación de los dos mundos en el propio procesador. Esto está indicado por el bit llamado NS-bit (Non-Secure-bit) en el registro de configuración segura (Secure Configuration Register, SCR) del procesador. Este bit puede ser cambiado solamente por el sistema que se ejecuta en el mundo seguro. Cuando NS-bit es 0 el procesador está operando en el mundo seguro, de otra forma está operando en el mundo normal. Un estado especial se crea dentro del mundo seguro para facilitar el intercambio o activación de los mundos. Este estado se llama monitor mode. El mundo normal puede inicializar este monitor mode llamando a la instrucción Secure Monitor Call (SMC). Las excepciones del hardware como las interrupciones también pueden causar el cambio hacia el mundo seguro. Cuando el cambio entre mundos ocurre a consecuencia de una llamada al SMC o por una excepción, se habilita el monitor mode del mundo seguro. El monitor mode se asegura que el estado del mundo que se está dejando está salvado y que el estado del mundo en el que se está entrando sea restaurado [26]. Se recomienda habilitar el monitor mode también para el intercambio del mundo seguro al mundo normal. Un limitante que presenta la utilización de la Zona Segura es que la llave nunca podrá extraerse de la misma y en caso de pérdida del dispositivo móvil, los datos cifrados no podrán volverse a descifrar. Una solución pudiera ser generar la llave fuera del entorno seguro para poder resguardarla por otra vía (por ejemplo, un dispositivo USB en una caja fuerte) y luego introducirla en el mundo seguro, de dónde no se podrá extraer. También, se realiza como técnica, la generación de una llave que se salva en el sistema de archivos Tecnologías Página | 22 del teléfono, pero cifrada y gestionada por el mundo seguro. De esta forma, la llave sería recuperable y transmisible hacia otros dispositivos, sin perder la seguridad. Estas características serán utilizadas en nuestro trabajo para el almacenamiento seguro de la llave privada que se utilizará para codificar la información y son la respuesta al primer reto encontrado. Existe sin embargo una forma de vulnerar la seguridad de la Zona Segura. En el caso de que el teléfono esté “rooteado” es decir, que se tengan todos los permisos para trabajar con las aplicaciones y acceso para inspeccionar el sistema de ficheros, la Zona Segura es vulnerable. Las llaves creadas por el TEE no se guardan precisamente en la Zona Segura debido al tamaño limitado de esta y a la cantidad de llaves que pueden generarse. Cuando una nueva llave se genera, dos ficheros son creados en la carpeta /data/misc/keystore/user_0: − Un archivo USRPKEY que guarda parámetros del par de llaves generado, incluyendo la llave privada cifrada por una llave especial del dispositivo que se encuentra dentro de la Zona Segura y nunca sale de ahí. − Un archivo USRCERT que guarda el certificado para la llave pública. Ambos ficheros tienen el siguiente formato de nombre (identificador de la aplicación)_USRPKEY_(alias de la llave) y (identificador de la aplicación)_USRCERT_(alias de la llave). Por ejemplo 10102_USRPKEY_CryptoDroid. El alias de la llave se escoge por el programador de la aplicación. La carpeta /data/misc/keystore/user_0 con los ficheros de las llaves, no es accesible por un usuario que no tenga los privilegios de root y las aplicaciones no pueden acceder a las llaves de otras aplicaciones. Usando los permisos de root un atacante puede renombrar o copiar estos archivos dentro del mismo directorio en el mismo dispositivo móvil, con el identificador de una aplicación maliciosa. Bajo este escenario la llave privada puede ser accedida por la aplicación maliciosa. Claro, la llave seguiría cifrada y no se conocería como tal, pero podría utilizarse para realizar operaciones de cifrado/descifrado, vulnerando la seguridad de los datos del usuario. Por tanto, un teléfono rooteado, es inseguro por definición. La Zona Segura no es una característica utilizada solamente por móviles con Sistema Operativo Android, Microsoft también hace uso de ella con Trusted Lenguage Runtime (TLR), el cual es un sistema que protege la confidencialidad e integridad de las aplicaciones .NET para móviles, de las brechas de seguridad del Sistema Operativo. Proporciona la separación de la lógica sensible de las aplicaciones, del resto de la aplicación independizándola del Sistema Operativo y de las otras aplicaciones [27]. Con el TLR una aplicación móvil está particionada en dos componentes: un pequeño componente que se ejecuta en el mundo seguro y un componente grande potencialmente inseguro que Tecnologías Página | 23 implementa la mayoría de las funcionalidades de la aplicación y se ejecuta en el mundo normal. El prototipo de este trabajo, utilizará la API de cifrado de Android para realizar las operaciones criptográficas. En caso de que el teléfono tenga por hardware estas características de zona segura, se aprovechará la seguridad que esta brinda, asumiendo que el teléfono es seguro y no está rooteado. En caso de teléfonos “normales” que no implementen Zona Segura, igualmente el prototipo funcionará, lo que las operaciones se realizarán por software en el mundo normal. 2.3 TRASMISIÓN DE LA INFORMACIÓN DE FORMA SEGURA. SSL Los teléfonos se utilizan para almacenar y generar datos. Estos datos pueden transmitirse hacia afuera y hacia adentro de los mismos a través de la Wifi, Bluetooth, de la Red de Datos o el cable USB. El prototipo del presente trabajo, pretende utilizar protocolos de comunicación estándares y que al extremo conectado al dispositivo utilizado para cifrar se le añada solamente el requisito de tener un navegador web estándar para realizar la comunicación. Esto descarta el uso del cable USB o el Bluetooth ya que para su utilización, se requiere instalar software adicional en el dispositivo y este no es un objetivo. Se descarta también la Red de Datos pues es inexistente en nuestro país, por tanto es imposible hacer pruebas sobre ella. La transmisión entonces, se efectuará a través de la Wifi interna sin conexión a Internet. Como se conoce, existen varias técnicas de cifrado para el intercambio de información. En un cifrado simétrico, antes de que los datos sean enviados, la llave debe compartirse entre el emisor y el receptor. El emisor luego de haber cifrado la información usando la llave previamente adquirida, la envía y el receptor descifra la información haciendo uso de la misma llave que comparte con el emisor. Esto implica poner de acuerdo a cada par emisorreceptor, lo que no es muy viable precisamente en el escenario móvil, y no siempre el que codifica para enviar tiene que tener el poder de decodificar para ver. En un cifrado asimétrico por otra parte, la llave pública se utiliza para codificar la información y la llave privada, para decodificarla [7]. La ventaja de la Infraestructura de la llave Pública sobre el cifrado simétrico es la llave pública puede viajar por redes inseguras permitiendo que diferentes emisores dispongan de dicha llave para comunicarse con el receptor de forma segura porque para descifrar la información que envían, este también necesita de la llave privada. En el caso del cifrado simétrico, la llave tiene que conocerse por ambas partes y no puede transmitirse por redes públicas, por lo que es poco útil su uso en la nube. Sin embargo, se conoce que los algoritmos de cifrado asimétrico son más lentos que los simétricos, por tanto, una estrategia a seguir sería la utilización mixta de los mismos. Para proteger las comunicaciones del ataque conocido como ataque de hombre intermedio (Man In The Middle Attacks, MITM) existen protocolos como Transport Layer Tecnologías Página | 24 Security (TLS) y Secure Sockets Layer (SSL) que utilizan una PKI para cifrar las comunicaciones asegurándolas entre los servidores web y los navegadores. SSL funciona de la siguiente forma [28]. Primeramente el navegador hace un pedido a una página segura (https://) y en respuesta, el servidor web envía su llave pública y su certificado digital. Para garantizar la seguridad adecuadamente, no basta con enviar la llave pública y esperar por la información cifrada, ya que un hacker pudiera interceptar la comunicación con el potencial emisor y enviarle a este una llave pública falsa para así leer el contenido cifrado que este envíe. Para que el emisor y receptor no se enteren de la interferencia, se recodificaría dicha información ya leída con la llave pública real antes de enviarla al receptor. Esto se resuelve mediante un mecanismo de verificación de llave pública dónde el emisor (navegador) solamente aceptará llaves públicas confiables. Para ello, se han establecido Autoridades Certificadoras (CA) como VeriSing14, por ejemplo, que son las encargadas de generar pares públicos y privados, firmados digitalmente, de forma tal que posteriormente se pueda verificar la validez de la llave [29]. Los certificados contienen información sobre los dueños de los mismos, e-mail, nombre del dueño, uso del certificado, fecha de validez, nombre distintivo (DN) el cual incluye el nombre común (CN) (que es la URL o la dirección de e-mail, en dependencia de para que se use el certificado) y el identificador de la persona (entidad) que certifica (firma) el certificado. Los certificados también incluyen un hash que se utiliza para asegurarse de que el certificado no ha sido modificado. Seguidamente el navegador chequea si el certificado digital es válido en cuanto a fecha de validez, si está relacionado con el sitio al que se está accediendo (comprueba que la URL sea igual al CN) y si fue expedido (firmado) por una parte confiable como VeriSing y si no ha sido revocado. Para firmar un certificado, una CA crea un hash a partir del mensaje escrito en él y lo cifra con su llave privada. El hash es un número proporcionado por una función de hash. Esta función es de un solo sentido, por lo tanto, es imposible obtener el mensaje a partir del hash y como pequeños cambios en el mensaje implican grandes cambios en el hash, es extremadamente difícil modificar el mensaje y mantener el hash original. La CA luego incluye este hash cifrado dentro del certificado acompañado del mensaje original. Para comprobar esta firma digital, el navegador recrea el hash del mensaje incluido en el certificado y descifra el hash original con la llave pública obtenida anteriormente. En caso de ser iguales, se está en presencia de un certificado válido. Una vez que las verificaciones al certificado sean exitosas, entonces el navegador le envía al servidor web una llave simétrica aleatoria cifrada con la llave pública del servidor y 14 https://www.verisign.es Tecnologías Página | 25 además, cifrado con la llave simétrica la URL requerida con otros datos http. El servidor web entonces usa su llave privada para descifrar la llave simétrica del navegador y la utiliza en las labores de descifrado de los datos enviados por el navegador. Seguidamente responde a los pedidos de este enviando el documento html y los datos http cifrados con la llave simétrica del navegador. El navegador a su vez descifra los datos y muestra la información. En un mundo cada vez más dinámico, como es el caso de los escenarios en que participan los teléfonos inteligentes, dónde las direcciones IP cambian constantemente, es mucho más difícil utilizar un certificado digital válido generado por una CA de confianza, ya que habría que asociar también dinámicamente dicho IP con un nombre de dominio válido. Existen varios servicios como DynDNS15, FreeDNS16 y NoIP17 que pretenden resolver este problema, pero requieren que el dispositivo esté conectado a Internet y ciertos mecanismos de autenticación. Estos servicios necesitan la instalación de una aplicación extra en nuestro dispositivo móvil como DynDNS client18. Una vez instalada, el IP del móvil se relacionaría, por ejemplo, con el nombre galaxys4.dyndns.org, por lo que se podría acceder a él vía http://galaxys4.dundns.org. En caso de que la IP cambie, DynDNS client se encargaría de actualizar el registro DNS, lo que permitiría el acceso a nuestro dispositivo de forma permanente. Esto resuelve sólo el descubrimiento del dispositivo en la red y no la seguridad del canal con SSL. Para asegurar el canal, utilizando HTTPS, se requiere un certificado digital válido (Certificate Authority-signed certificates) que ponga “en verde” la barra de nuestro navegador. No basta con tener un certificado digital (por ejemplo, uno auto-firmado), ya que si el navegador no es capaz de verificar la autenticidad de dicho certificado mediante una entidad certificadora, un hacker podría cambiar el certificado y simular HTTPS. El problema es que las autoridades certificadoras, sólo generan certificados para dominios registrados. Por tanto, si queremos HTTPS con una “barra verde”, habría que comprar un dominio galaxys4.com y sacar un certificado para él. DynDNS también brinda este servicio pero requiere costo adicional. Si quisiéramos utilizar un certificado digital auto-firmado (Self-signed) para asegurar el canal con nuestro dispositivo móvil (y así no incurrir en gastos adicionales) tendremos que considerar que nos saldrá una advertencia de seguridad en el navegador y tendremos que validar o no el certificado digital manualmente y proseguir con la navegación. Para determinar que el certificado digital es el correcto, habría que mostrar la huella digital (thumbprint o fingerprint, lista de números o hash que identifican al certificado digital de forma única) en la pantalla del dispositivo Android para que el usuario pueda comparar 15 http://es.dyn.com/dns/ http://freedns.afraid.org/ 17 http://www.noip.com/managed-dns 18 https://play.google.com/store/apps/details?id=com.dyndns&hl=es...This 16 Tecnologías Página | 26 éste con el que muestra el navegador y en caso de coincidir saber que es el certificado correcto. Una vez que se valide el certificado, la navegación será tan segura como con “barra verde”. Como se comentó anteriormente, los navegadores web validan los certificados comparando el CN del certificado con la IP o el nombre de la URL. Para que estos certificados entonces sean válidos, cada vez que se conecte con una IP determinada, habría que validar el certificado para dicha IP. Dado que las direcciones IP son dinámicas y varían constantemente sería molesto para el usuario, tener que validar un certificado digital diferente para cada una de ellas. Para evitar esto, CryptoDROID presenta su propia CA. La CA de CryptoDROID genera un certificado digital raíz y una llave privada. La CA se encarga de generar los certificados digitales para cada una de las IPs dinámicas y los firma con la llave privada. Como estos certificados están firmados por la CA, el navegador confiará en ellos y el usuario no tendría que estar aceptando y validando cada vez que se cambia de IP un nuevo certificado, siempre y cuando, el certificado de la CA se añada a la lista de confianza de entidades certificadoras del sistema operativo. Para ello, es necesario que la primera vez que se conecta con CryptoDROID desde una PC, se haga la instalación del Certificado Digital Raíz y una vez confiando en él, se confiará en el resto de los certificados generados. Este es un paso manual que atenta contra la versatilidad del uso de la propuesta del presente trabajo, pero es el mecanismo más sencillo encontrado que no requiere conexión a Internet. Además, si se utilizase CryptoDROID en un entorno empresarial interno, este despliegue de certificados pudiera realizarse de forma centralizada automáticamente. Por otra parte, el usuario no debería acceder a sus datos privados desde cualquier PC que no sea confiable, ya que esta podría contener virus o alguna aplicación maligna que haga copia sin autorización de los datos del usuario, y para ello no hay protección ya que una vez que el usuario autorice el acceso al dispositivo, cualquier aplicación que ejecute con los privilegios de dicho usuario pudiera acceder a toda su información privada. Por tanto, el paso de instalar el certificado raíz de CryptoDROID se haría solo la primera vez en los dispositivos confiables del usuario. Con este mecanismo se resuelve el segundo de los retos planteados en el capítulo introductorio. 2.4 AUTENTIFICACIÓN DEL USUARIO Una vez establecido el canal seguro (utilizando SSL o TLS), se debe proceder a la autenticación del usuario. Como se sabe, la autentificación por contraseña no es del todo segura debido a que a veces estas pueden ser fáciles de adivinar, los usuarios las suelen escribir en algún papel, las envían por email o las comparten de alguna forma con un tercero. Un mecanismo de autentificación de dos pasos disminuye estos problemas. Los Tecnologías Página | 27 mecanismos de dos pasos, usualmente incluyen un secreto que conoce el usuario y una prueba adicional que se genera automáticamente que el usuario no conoce. Esto garantiza que un usuario malintencionado que robe el secreto, no pueda acceder a la información. El primer paso sería un secreto estático (PIN, contraseña) que solo el usuario conoce, que le permita solo a él acceder a su información. El segundo de estos pasos sería la generación de un secreto volátil (código autogenerado y aleatorio) que se confirmaría a través de un mecanismo alternativo a la conexión de red, para así autenticar el canal de comunicación, pudiendo ser este un QRCode que pueda validarse a través de la cámara del teléfono u otro sensor o simplemente un código autogenerado que se visualice en la pantalla del teléfono. En CryptoDROID, este segundo paso es un nombre de usuario autogenerado que se muestra en la interfaz del teléfono y que el usuario debe leer y utilizar para conectarse al móvil. Se escogió esta alternativa sobre el QRCode y los sensores debido a una limitante de los clientes WebDAV existentes en el mercado. WebDAV es una extensión del protocolo HTTP, que se explicará en la próxima sección, que permite manejar colecciones de ficheros de forma remota. El sistema operativo Windows, por ejemplo, integra con el explorador de Windows, un cliente WebDAV que permite acceder remotamente a estas colecciones como si fueran una carpeta más del disco duro, abstrayendo al usuario final de toda la complejidad de la transmisión por la web. Pero el tipo de autenticación que el cliente WebDAV de Windows soporta es la básica de HTTP, requiriendo un nombre de usuario y una contraseña. Esto impide, realizar autenticaciones extras utilizando otros mecanismos. Por tanto, se decidió, que CryptoDROID generase un usuario aleatorio como verificación de segundo paso, y la contraseña que fuese el secreto del usuario. Con esto se garantiza que la persona que esté sentada en la PC y que intenta acceder a la información privada sea realmente el portador del teléfono (y no otra persona conectada a la Red) y con el primer paso se autentica al dueño de la información privada (por si alguien se robó o se encontró el teléfono perdido). Está claro que esto no ayuda si la contraseña y el móvil fueron robados a la vez (por ejemplo, si el usuario está bajo una amenaza física), pero el caso que eso suceda, es menos probable y ya depende de la persona y no de la tecnología. Con este mecanismo de autentificación se resuelve el último de los retos planteados en el capítulo introductorio. 2.5 NAVEGACIÓN POR LOS FICHEROS CIFRADOS. WEBDAV Una vez superada satisfactoriamente la autentificación viene la fase de la navegación dónde se trabaja con los ficheros guardados en el teléfono. Para ello se utiliza el protocolo Web Distributed Authoring and Versioning (WebDAV) el cual consiste en una extensión del Protocolo HTTP con el objetivo de administrar recursos remotamente [30]. Tecnologías Página | 28 WebDAV agrega en un conjunto de métodos, encabezados y tipos de contenido añadidos a HTTP con el fin de manejar las propiedades, el bloqueo de los recursos, la creación y modificación de colecciones y la manipulación de las URLs. Las colecciones es el término utilizado por WebDAV para el agrupamiento de recursos, URIs, en muchos casos similar a un directorio. Al igual que con el método PUT para crear archivos, las colecciones se crean con el nuevo método MKCOL que se le añade a HTTP. Las propiedades se refieren a metadatos asociados a archivos y colecciones (Autor, Título, Tamaño, entre otras). Un cliente puede mostrar u obtener las propiedades asociadas a un recurso con el nuevo método PROPFIND, y puede cambiarlas con el método PROPPATCH. Algunas propiedades son completamente creadas y controladas por los usuarios (por ejemplo, una propiedad llamada “color”), y otras creadas y administradas por el servidor WebDAV (por ejemplo, la propiedad que contiene la última fecha de modificación de un archivo). Las primeras son llamadas propiedades “muertas” y las segundas propiedades “vivas”. La gestión de los bloqueos de recursos en WebDAV es opcional. Los clientes pueden usar los nuevos métodos LOCK y UNLOCK para mediar el acceso a un recurso. En la mayoría de los casos estos métodos se utilizan para crear bloqueos de escritura exclusivos, aunque también es posible tener bloqueos de escritura compartidos. En el caso de una PC Windows, con WebDAV se podrán visualizar los datos del teléfono como si fuese una carpeta más del sistema operativo y el usuario final (el dueño del teléfono Android) se abstraerá de los mecanismos de transmisión y codificación que existen por detrás. Otros dispositivos, con otros sistemas operativos no Windows, accederían también a los datos, ya que integran clientes WebDAV en su interfaz (como es el caso de Gnome, en Ubuntu Linux) o tienen una aplicación disponible para este fin en la tienda de aplicaciones relacionadas al sistema operativo (Google Play, en el caso de Android). Es entonces dónde el intercambio entre el navegador y la aplicación de cifrado fluye y el teléfono cumple con su función de TPD. Con el objetivo de probar la velocidad de transmisión de ficheros cifrados con la zona segura y ficheros normales que no pasan por el proceso de cifrado, y así obtener una estadística, en el prototipo también se permitió el acceso a la memoria SD-CARD del teléfono a través de la interfaz WebDAV. De esta forma el usuario puede acceder a los datos cifrados y a las partes de la memoria de su teléfono que no está cifrada. Prototipo Página | 29 3 Prototipo La propuesta del presente trabajo, a diferencia de las existentes analizadas en el estado del arte, permitirá utilizar un único dispositivo como dispositivo de cifrado, pero, a través de la red, se podrá acceder a estos datos cifrados desde otros dispositivos. Esto significa que el usuario podrá acceder a sus datos desde cualquier dispositivo, pero el cifrado/descifrado se realizará en un único dispositivo personal (el teléfono Android). Y como la llave privada no saldrá de dicho dispositivo, ya que está a su vez almacenada de forma segura por hardware utilizando la Zona Segura, las probabilidades de hacking se minimizan. Con esto se podrá reemplazar el TPD clásico, usualmente en formato memoria USB, por un teléfono Android. Como valor agregado, el almacenamiento de los datos cifrados se podrá realizar, en la memoria local del teléfono y en la nube, lo que no puede lograrse con un TPD clásico. CryptoDROID, es el nombre que se le ha dado al prototipo que permite al teléfono comportarse como un TPD aplicando todos los mecanismos de seguridad descritos anteriormente en el capítulo 2. El prototipo tiene como objetivo mostrar la factibilidad del reemplazo de los TPD por un teléfono Android además de analizar su seguridad, así como ilustrar su utilización en la práctica con un modelo de aplicación que supere los problemas que se encontraron durante el desarrollo de este trabajo. En la implementación se utilizan algoritmos estándares de codificación como RSA y AES, paralelizando las operaciones de trasmisión, codificación y decodificación para a su vez explorar así las capacidades multi-núcleo de los teléfonos inteligentes actuales. Se brinda una interfaz de comunicación estándar utilizando los protocolos HTTPS y WebDAV para acceder a la información. 3.1 ARQUITECTURA La Figura 3-1 muestra la arquitectura de CryptoDROID. En la parte izquierda de la imagen se muestra un teléfono Android dividido por una línea discontinua roja. Esto representa la división de los mundos (el mundo seguro del mundo normal). En el mundo seguro se generará y se guardará la llave y además se ejecutarán los procesos de cifrado y descifrado de los datos. En el mundo normal se ejecutarán el servidor web seguro con SSL y el servidor WebDAV. Este mundo se comunicará con el seguro como se expondrá en la sección 3.4. La interfaz de usuario muestra los datos necesarios para establecer una comunicación segura con las PCs clientes de CryptoDROID. Trusted Personal Device Prototipo Página | 30 Zona Android Segura TEE SO Llave Llave Privada Privada Motor de Cifrado Motor de Cifrado UI Aplicación UI Servicio Aplicación de Aplicación Fichero Llave 11 Fichero de Llave 2 Fichero Maestra Fichero 2 Maestra Fichero 3 Fichero 3 . . . Fichero n . Fichero n Datos / Wifi HTTP WebDav SSL Google Drive / Dropbox SkyDrive LAN WAN INTERNET UI Aplicación Aplicación Motor de Cifrado UI Fichero Fichero 1 1 Fichero 2 2 Fichero Fichero 3 Fichero 3 . .. . Fichero n Fichero n Llave Privada Otros Dispositivos Personales Figura 3-1 Arquitectura de CryptoDROID Se puede apreciar también en la Figura 3-1 que los demás dispositivos personales de confianza no tienen la aplicación instalada y por consiguiente no tienen la llave de descifrado de los ficheros codificados. Estos dispositivos personales se conectan a través de la Wifi con CryptoDROID y de esta forma se tiene acceso a los ficheros cifrados utilizando el protocolo WebDAV. 3.2 FUNCIONAMIENTO CryptoDROID funciona de la siguiente manera. El dispositivo Android estará cumpliendo la función de servidor e intercambiando información con un cliente, es decir, se conectaría la PC al móvil usando la Wifi. Existen un conjunto de fases que se deben satisfacer para establecer una comunicación exitosa y se cumpla el objetivo perseguido. Una vez el usuario acceda a CryptoDROID se requerirá que introduzca una contraseña previamente configurada. Este Layout se muestra en la Figura 3-2. Prototipo Página | 31 Figura 3-2 Contraseña para acceder a CryptoDROID Si la contraseña es correcta CryptoDROID levanta un Servicio Web en el móvil y se despliega un mecanismo de descubrimiento para detectar las posibles IP por las cuales el usuario pudiera conectarse desde un cliente WebDAV. Usando estas IPs la CA del prototipo genera los certificados digitales que se utilizaran para validar el canal con el navegador. Ejemplos de certificados generados se pueden ver en la Figura 3-3. Figura 3-3 Certificados Generados por la CA de CryptoDROID En la Figura 3-4 se muestra la imagen de espera de CryptoDROID mientras se generan los certificados requeridos en este paso. Prototipo Página | 32 Figura 3-4 Generando Certificados Digitales El servidor web brinda un conjunto de direcciones (IP + puerto) por los cuales se pudiera establecer la comunicación, siempre utilizando SSL. Estas IPs varían y para no utilizar aplicaciones de terceros como DynDNS Client se recomienda conectarse a CryptoDROID usando una IP y no un nombre o dominio. La Figura 3-5 muestra la interfaz de usuario de CryptoDROID representativa dónde se aprecian el conjunto de direcciones para conectar. En la interfaz de usuario también se encuentra un nombre de usuario autogenerado que el usuario debe escribir en el cliente WebDAV como parte de la autenticación de dos partes y una contraseña que se debe usar para autenticarse. Figura 3-5 Interfaz de CryptoDROID Prototipo Página | 33 El usuario entonces escribiría manualmente en la barra de direcciones del navegador, una de las direcciones proporcionadas por CryptoDROID tal y como muestra La Figura 3-6. Figura 3-6 Conectándose a CryptoDROID desde un Navegador Web Seguidamente, el navegador dará una alerta de seguridad, como la que se muestra en la Figura 3-7, pues no reconoce el certificado digital auto-firmado. Entonces lo que debe hacerse es aceptar el riesgo como se señala en la figura con los círculos rojos (uno en Firefox y otro en Internet Explorer). Figura 3-7 Alerta de Seguridad por Certificado Auto-Firmado CryptoDROID como Autoridad Certificadora entonces pone a su disposición la descarga de un certificado digital raíz como muestra la Figura 3-8 el cual debe ser instalado sólo la primera vez que se usa la aplicación en la PC desde dónde se accede a CryptoDROID. Los pasos a seguir están bien señalados en la figura con círculos rojos y números. Prototipo Página | 34 Figura 3-8 Descarga de Certificado Raíz Cuando se abre el certificado, se debe comprobar que la huella digital (fingerprint) del mismo sea igual al que está mostrando CryptoDROID en la pantalla. Este paso se aprecia en la Figura 3-9. Nótese que se debe acceder a la pestaña detalles de la ventana Certificado y en ella, hacer clic en la Huella Digital para poder ver el fingerprint completo y poder hacer la comparación con el de CryptoDROID. Comparar Fingerprint Figura 3-9 Comparación de Huella Digital Prototipo Página | 35 Una vez satisfecha la comprobación y se sepa que el certificado es genuino, se debe proceder a la instalación del mismo en la pestaña General de la misma ventana Certificado. La Figura 3-10 muestra una guía para el asistente de la instalación en el caso de Windows. Figura 3-10 Instalación de Certificado Una vez instalado el certificado, nótese en la Figura 3-11 el candado que garantiza la navegación segura. Una vez garantizado esto, podemos utilizar un cliente WebDAV para conectarnos al servidor WebDAV integrado dentro de CryptoDROID o utilizar el que viene integrado con Windows. La Figura 3-11 ilustra cómo hacerlo. Prototipo Página | 36 Figura 3-11 Navegación Segura Una vez establecida la conexión con el servidor WebDAV se tendría acceso a dos directorios principales como muestra la Figura 3-12. El primero de ellos es el private en dónde se encuentran los datos cifrados y cada vez que se acceda a alguno de ellos CryptoDROID se encarga de descifrarlos para que el usuario tenga acceso a él. Así también si se copian ficheros dentro de la carpeta private estos se estarán copiando y cifrando a la vez. Figura 3-12 Conexión con El servidor WebDAV de CryptoDROID En este punto hay que hacer una salvedad importante. El cliente WebDAV de Windows guarda en una carpeta de la PC todos los ficheros que se han manejado (%systemdrive%\windows\ServiceProfiles\LocalService\AppData\Local\Temp\TfsStore) Prototipo Página | 37 utilizándola como su caché. Por lo tanto, si estos son sensibles, deben ser eliminados una vez que se termine el trabajo, acción que Windows no realiza automáticamente. La segunda carpeta es sdcard por la cual se puede navegar y tener acceso a la memoria del teléfono. Esta carpeta no está cifrada. Aquí se explotan las capacidades del protocolo WebDAV brindándole funcionalidad extra a CryptoDROID. 3.3 MÓDULOS CryptoDROID se divide en tres partes fundamentales. El módulo de procesamiento (cifrado/descifrado), el módulo de transporte y la interfaz de usuario. El módulo de procesamiento está compuesto por una clase fundamental llamada EncryptionDecryptionManager que es la encargada de llevar a cabo los procesos de Cifrado y Descifrado. Para ello se utilizan dos algoritmos de cifrado, AES y RSA. El primero se utiliza para cifrar a los ficheros (generándose una llave y un vector de inicialización aleatorios por fichero) y el segundo para cifrar las llaves AES utilizadas para cifrar dichos ficheros. En particular se utiliza AES con el modo de operación CBC y una llave de 256 bits para todos los bloques a cifrar a excepción del último donde se utiliza el modo CFB. Ambos modos utilizan NoPappding, es decir, no utilizan esquema de relleno alguno, ya que el primer modo se aplica a bloques enteros que no requieren de relleno y el segundo modo garantiza que el tamaño del contenido del fichero original sea igual al tamaño del contenido del fichero cifrado. Pero a cada fichero, además de su contenido, se le añade un metadato de 512 bytes, dónde se almacena la llave AES utilizada para cifrar el fichero, un vector de inicialización autogenerado y se reservan 16 bytes para uso futuro. A este bloque se le aplica RSA con ECB, PCKS1Padding y con una llave de 4096 bits. Esta mezcla entre RSA y AES aumenta la seguridad de los datos, ya que si un hacker descubre la llave para cifrar dicho fichero, solo tendría acceso a su contenido y no al resto de los ficheros. Como se utiliza el modo encadenado de AES-CBC, para evitar tener que volver a cifrar el fichero completo si el usuario realiza un cambio en una parte de él, estos se procesan por bloques de tamaño fijo (16Kb en principio) y a cada uno de estos bloques se le genera su propio vector de inicialización para saltear el texto cifrado. Pero para no tener que almacenar un vector de inicialización por cada bloque (el IV se requiere obligatoriamente para descifrar los datos) y no gastar espacio extra (dónde un IV por bloque puede ser considerable), el vector de inicialización de AES se autogenera a partir del inicial utilizando la siguiente fórmula 𝐸𝑆𝑆𝐼𝑉(𝑘) = 𝐴𝐸𝑆256(𝐼𝑉, 𝑘) dónde k es el número de bloque. De esta forma, a la hora de descifrar la información se puede volver a generar el ESSIV y no es necesario guardarlo. Esto ocurre con todos los bloques a excepción del primero que tiene su vector de inicialización (IV) aleatoriamente generado y que sí se guarda junto con la llave AES cifrada a su vez con RSA en el encabezado del fichero tal y como se muestra en la Figura 3-13. El resto del fichero se llena con los bloques AES, divididos a su vez por los Prototipo Página | 38 bloques de tamaño fijo y el último de ellos es variable ya que cambia el modo AES de CBC a CFB. LLAVE AES 256 512 bits (64 bytes) VECTOR INICIALIZACIÓN AES 128 RANDOM PADDING BLOQUE CIFRADO AES Bloque 0 (16 Kb) ... Bloque cifrado con RSA 4096 128 bits AES 256 CBC + ESSIV BLOQUE CIFRADO AES . . . BLOQUE CIFRADO AES Bloque n (max 16 Kb) ... AES 256 CFB + ESSIV Figura 3-13 Estructura de Fichero Cifrado con CryptoDROID El módulo autoridad certificadora (implementado en la clase CaManager) es el encargado de generar todos los certificados digitales que sean necesarios para asegurar los canales de comunicación con CryptoDROID. El módulo de transportación es el módulo intermedio entre el módulo de procesamiento y la interfaz de usuario. Está compuesto por la clase SecureWebServerDroid. La idea que envuelve esta clase es levantar un servidor web seguro que utilice el protocolo SSL para transportar los datos. Para ello se utilizan certificados digitales firmados por el módulo autoridad certificadora que se generan por cada una de las posibles direcciones IP. También, dentro de la clase SecureWebServerDroid, se ha realizado una implementación del protocolo WebDAV para lograr que el usuario tenga la sensación de estar trabajando sobre ficheros que están en la PC con la cual accede a los datos y no en el dispositivo móvil. Prototipo Página | 39 La implementación de WebDAV realizada, permite ir leyendo el stream SSL en tiempo real y mientras van llegando los datos, se van dividiendo en bloques de 16 Kb, y CryptoDROID va realizando el cifrado de los mismos en paralelo mientras se llena el buffer del stack TCP/IP con los próximos 16 Kb. Esto ha traído como resultado que sea tan rápido transmitir documentos cifrados como no cifrados a través de WebDAV. La interfaz de usuario es relativamente sencilla. El primer Layout además de presentar el nombre de nuestro prototipo muestra la huella digital del certificado raíz, generado por CryptoDROID, y las URLs por las cuales se puede conectar con él. Este primer Layout también presenta un nombre de usuario nuevo autogenerado cada vez que se accede a la aplicación y que sirve como parte de la autentificación de dos pasos. 3.4 BIBLIOTECAS Y CLASES UTILIZADAS Mono es un proyecto open source que brinda un compilador de C# y el CLR para sistemas operativos No-Windows. Junto con C#, corren otros lenguajes en Mono como Java, F#, Basic, entre otros. Desde sus inicios Mono ha crecido incorporando las muchas características de .NET. Xamarin, una empresa creada por los desarrolladores de Mono, se dedica a mantener y desarrollador este producto además de nuevos productos como MonoTouch y Mono for Andorid. El primero permite a los desarrolladores familiarizados con C# desarrollar aplicaciones para Apple iPhone, mientras que el segundo permite a los desarrolladores .NET crear aplicaciones nativas que corren sobre Android. Estas aplicaciones se sienten como las aplicaciones de Java nativas. Con Mono for Android las aplicaciones son compiladas a código ejecutable que ejecuta sobre los dispositivos Android. Xamarin Android (anteriormente conocido como Mono for Android) brinda una capa .NET sobre la capa nativa de programación en el sistema operativo Android permitiendo a los desarrolladores crear aplicaciones que ejecuten nativamente sobre Android. Mono for Android brinda también una capa puente entre las APIs nativas de Android y las APIs de .NET. Debido a esto, en el prototipo que se ha implementado, se utilizan muchas bibliotecas .NET como: System.IO, System.Security, System.Text, System.Security.Cryptography entre otras. Android utiliza una máquina virtual especial llamada Dalvik como base para las aplicaciones y servicios. Esta máquina virtual está basada en el lenguaje Java y como resultado, una parte de las APIs de Java fueron portadas a Android y nuevas fueron añadidas. Las APIs de Java que proporcionan operaciones criptográficas se encuentran en el paquete Java.Security. Funcionalidades adicionales que no se encuentran en las bibliotecas de Java están implementadas en el paquete Android.Security. Xamarin Android garantiza que toda esta API se pueda utilizar con C#. Prototipo Página | 40 Módulo de Procesamiento Android brinda varias soluciones con el fin de guardar la llave de cifrado de forma segura y las operaciones criptográficas desde sus inicios con la API versión 1. La clase Java.Security.KeyStore brinda una interfaz estandarizada para la salva de la llave. La clase KeyStore solo provee una interfaz para guardar las llaves y facilidades para obtener instancias de clases encargadas de guardar las llaves. La salva de la llave en realidad se realiza por diferentes tipos de almacenadores de llaves. Cada uno de estos tipos está definido en una clase que implementa la interfaz Java.Security.KeystoreSpi. La clase KeyStore usa los métodos proporcionados por KeystoreSpi brindando métodos uniformes usados por los programadores para salvar la llave. Actualmente el almacenamiento de la llave de forma segura se realiza utilizando dos tipos de almacenamiento de llaves principales: Bouncy Castle19 y AndroidKeyStore [25]. Bouncy Castle es una biblioteca para Java que se encuentra en todas las versiones de Android, de forma limitada. Existen muchas funcionalidades en la biblioteca original que los desarrolladores de Android consideraron no necesarias. Sin embargo, la versión completa de esta biblioteca puede incluirse en cualquier aplicación de Android y se puede encontrar en Github con el nombre de Spongy Castle. AndroidKeyStore se añade en la API 18 (Android 4.3). Se comunica con un servicio llamado KeyStore el cuál se inicia cuando el dispositivo arranca. Los fabricantes de dispositivos móviles desarrollan controladores para su hardware que se comunican con este servicio para proveer almacenamiento basado en el hardware. Si estos controladores no existen entonces el almacenamiento será basado en software. Figura 3-14 Composición de AndroidKeyStore hardware-based 19 https://www.bouncycastle.org/ Prototipo Página | 41 AndroidKeyStore se implementa en los dispositivos que presentan Zona Segura utilizando el servicio KeyMaster que ejecuta sobre Android y un Truslet que se ejecuta en el TEE y es el responsable de las operaciones sobre la llave. Una aplicación como la que propone este trabajo, que utilice AndroidKeyStore (hardware-based) realizaría este proceso como se muestra en la Figura 3-14. Con el fin de ofrecer la misma interfaz con AndroidKeyStore para aquellos dispositivos móviles que no disponen del hardware necesario o no presentan los controladores, se ha desarrollado un equivalente basado en software del Truslet KeyMaster. La Figura 3-15 muestra una aplicación utilizando AndroidKeyStore software-based. AndroidKeyStore no brinda una API para proteger las llaves con una contraseña especificada por el usuario, lo que podría proteger de la vulnerabilidad que presenta la Zona Segura de los ataques en teléfonos rooteados. Diferentes dispositivos móviles tienen diferentes AndroidKeyStore, lo que implica que pueden tener o no TEE. Incluso el mismo modelo de dispositivo móvil puede tener o no la TEE dependiendo de la versión de Android que tenga. Figura 3-15 Composición de AndroidKeyStore software-based Un almacenador de llave de un tipo en especial, puede accederse con la siguiente línea de código _keyStore = KeyStore.GetInstance(type); dónde type sería un string con el valor "AndroidKeyStore" (en este caso). Java.Security también brinda KeyPairGenerator el cual genera la llave RSA utilizada para cifrar las llaves AES con que se cifran a su vez los ficheros. Esta clase genera un par de llaves (pública y privada) y para ello, necesita de parámetros tales como el tamaño de la llave (4096 bits en este caso), el tiempo durante el cual este par va a ser válido, un alias (string definido por el desarrollador) para poder recuperar la llave privada posteriormente y el Prototipo Página | 42 contexto de la aplicación que está generando el par de llaves, entre otros parámetros. Un ejemplo de código se muestra en la Figura 3-16. public KeyPair GenerateKeyPair(Context context, string alias, string language="en-en") { Calendar cal = Calendar.GetInstance(new Locale(language)); Date now = cal.Time; cal.Add(CalendarField.Year, 25); Date end = cal.Time; KeyPairGenerator kpg = KeyPairGenerator.GetInstance("RSA", _provider); kpg.Initialize(new KeyPairGeneratorSpec.Builder(context) .SetAlias(alias) .SetStartDate(now) .SetEndDate(end) .SetSerialNumber(BigInteger.ValueOf(1)) .SetSubject(new X500Principal("CN="+alias)) .SetKeySize(4096) .Build()); return kpg.GenerateKeyPair(); } Figura 3-16 Generación de las llaves públicas y privadas Para generar las llaves AES para el cifrado de los datos sensibles, se utiliza la clase KeyGenerator que se encuentra dentro de la biblioteca Javax.Crypto. La llave se obtiene con las líneas de código que muestra la Figura 3-17. El parámetro _algorithm es un string con el valor "AES" (en este caso). var keyGenerator = KeyGenerator.GetInstance(_algorithm); keyGenerator.Init(512); var key = keyGenerator.GenerateKey(); Figura 3-17 Código que Genera las Llaves AES Nótese en la Figura 3-17 que se genera una llave de 512 bits cuando AES sólo acepta 256. Además de la llave AES, se está generando a la vez, el vector de inicialización (IV) de 128 bits y el resto no se utiliza. var aesCipher = Cipher.GetInstance(_algorithmAesCipher); aesCipher.Init(CipherMode.EncryptMode, new SecretKeySpec(key, _algorithmAesCipher), new IvParameterSpec(iv)); Figura 3-18 Inicialización para cifrado con AES En Javax.Crypto también encontramos la clase Cipher que se utiliza para cifrar los bloques de datos. En la Figura 3-18 se muestran las líneas de código para la inicialización de estos Prototipo Página | 43 objetos para le cifrado con AES. El parámetro _algorithmAesCipher es un string con el valor "AES/CBC/NoPadding" (que cumple con el formato Algoritmo/Modo/Padding) y se utiliza CipherMode.EncryptMode o CipherMode.DecryptMode en dependencia de que proceso se quiera ejecutar. Nótese en la Figura 3-18 también la utilización de las clases SecretKeySpec e IvParameterSpec que se encuentran en la biblioteca Javax.Crypto.Spec. Estas clases se utilizan para especificar la llave y el vector de inicialización respectivamente. var rsaCipher = Cipher.GetInstance(_algorithmRsaCipher); rsaCipher.Init(CipherMode.EncryptMode, publicKey); rsaCipher.Init(CipherMode.DecryptMode, privateKey); Figura 3-19 Líneas para el Cifrado con RSA En la Figura 3-19 se muestra la inicialización del objeto Cipher utilizado para el cifrado con RSA. La inicialización para RSA no es muy diferente de la inicialización para AES. El parámetro _algorithmRsaCipher es un string con el valor "RSA/ECB/PKCS1Padding". Se utiliza CipherMode.EncryptMode o CipherMode.DecryptMode de igual forma pero el segundo parámetro es la llave pública o privada en dependencia del proceso a ejecutarse. Módulo Autoridad Certificadora Para generar y manejar los certificados, se han utilizado las bibliotecas de Bouncy Castle (Org.BouncyCastle.Asn1, Org.BouncyCastle.Crypto, Org.BouncyCastle.Math, Org.BouncyCastle.OpenSsl, Org.BouncyCastle.Pkcs, Org.BouncyCastle.Security, Org.BouncyCastle.Utilities, Org.BouncyCastle.X509, entre otras). La clase X509V3CertificateGenerator es la encargada de generar el certificado. var certificateGenerator = new X509V3CertificateGenerator(); certificateGenerator.SetSerialNumber(serialNumber); certificateGenerator.SetSignatureAlgorithm(signatureAlgorithm); var issuerDN = new X509Name("CN=" +CryptoDroidIssuerName); var subjectDN = new X509Name(subjectName); certificateGenerator.SetIssuerDN(issuerDN); certificateGenerator.SetSubjectDN(subjectDN); certificateGenerator.SetNotBefore(dateNotBefore); certificateGenerator.SetNotAfter(dateNotBefore.AddYears(25)); certificateGenerator.SetPublicKey(subjectKeyPair.Public); var certificate = certificateGenerator.Generate(subjectKeyPair.Private, random); Figura 3-20 Generación de Certificado Raíz Prototipo Página | 44 La Figura 3-20 muestra el código para la utilización de esta clase. Nótese en el código que se van llenado datos referentes al certificado cómo número de serie, algoritmo para el firmado, el nombre de la entidad que brinda el certificado así como la llave privada utilizada para firmarlo y la pública distribuida a los clientes (navegadores). Estas llaves se generan usando las clases KeyGenerationParameters y RsaKeyPairGenerator. La Figura 321 muestra su utilización. var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength); var keyPairGenerator = new RsaKeyPairGenerator(); keyPairGenerator.Init(keyGenerationParameters); AsymmetricCipherKeyPair issuerKeyPair = keyPairGenerator.GenerateKeyPair(); Figura 3-21 Uso de las clases para Generar el par de llave pública y privada CryptoDROID guarda datos necesarios dentro de la memoria del teléfono en una carpeta que lleva su nombre. Dentro de ella hay una carpeta llamada cert en dónde se salvan todos los certificados generados y sus llaves privadas, para cada una de las IPs posibles por las cuales se puede conectar un usuario a CryptoDROID (Figura 3-3) así como también el certificado digital raíz (ca.cer) con su llave privada (ca.key). var caCertFile = Path.Combine(AppDataPath, "ca.cer"); using (var caFileStream = new FileStream(caCertFile, FileMode.Create, FileAccess.ReadWrite)) { var beginBytes = Encoding.ASCII.GetBytes("-----BEGIN CERTIFICATE-----\n"); caFileStream.Write(beginBytes, 0 , beginBytes.Length); var certBytes = certificate.GetEncoded(); certBytes = Base64.Encode(certBytes, Base64Flags.Default); caFileStream.Write(certBytes, 0, certBytes.Length); var endBytes = Encoding.ASCII.GetBytes("-----END CERTIFICATE-----\n"); caFileStream.Write(endBytes, 0, endBytes.Length); } Figura 3-22 Salva de Certificado raíz en formato PEM La vía para guardar estos certificados y sus llaves se muestra en las Figuras 3-22 y 3-23, respectivamente. Con la llave se hace uso de las clases PrivateKeyFactory, PrivateKeyInfo y PrivateKeyInfoFactory con el fin de cifrar y descifrar la llave privada. System.Security.Cryptography.X509Certificates es la biblioteca utilizada para generar y manejar los certificados digitales por SSL, mientras que System.Security.Cryptography contiene las clases para las llaves. Debido a esto, los certificados y las llaves (Org.BouncyCastle.X509.X509Certificate, RsaPrivateCrtKeyParameters) de las Prototipo Página | 45 bibliotecas de Bouncy Castle anteriormente expuestas, hay que transformarlas a instancias de las clases X509Certificate2 y RSAParameters respectivamente. var caKeyFile = Path.Combine(AppDataPath, "ca.key"); using (var caFileStream = new FileStream(caKeyFile, FileMode.Create, FileAccess.ReadWrite)) { var buffer = PrivateKeyFactory.EncryptKey(PkcsObjectIdentifiers.PbeWithSha1AndDesCbc, Password, Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()), 10, privateKey); caFileStream.Write(buffer, 0, buffer.Length); } Figura 3-23 Salva de llave privada La transformación del certificado es relativamente sencilla. Una vez se lean los bytes del fichero donde se guarda el certificado (*.cer) se crea el objeto X509Certificate2. El proceso con la llave privada es un poco más complejo. La Figura 3-24 muestra el código para alcanzar dicho objetivo. Prototipo Página | 46 var x509 = new X509Certificate2(pemObject.Content); using (var caKeyStream = new FileStream(caKeyFile, FileMode.Open, FileAccess.Read)) { var buffer = new byte[caKeyStream.Length]; caKeyStream.Read(buffer, 0, buffer.Length); var bcKey = PrivateKeyFactory.DecryptKey(Password, buffer); PrivateKeyInfo info = PrivateKeyInfoFactory.CreatePrivateKeyInfo(bcKey); var seq = (Asn1Sequence)Asn1Object.FromByteArray(info.PrivateKey.GetDerEncoded()); if (seq.Count != 9) throw new PemException("malformed sequence in RSA private key"); var rsa = new RsaPrivateKeyStructure(seq); RsaPrivateCrtKeyParameters rsaparams = new RsaPrivateCrtKeyParameters(rsa.Modulus, rsa.PublicExponent, rsa.PrivateExponent, rsa.Prime1,rsa.Prime2, rsa.Exponent1, rsa.Exponent2, rsa.Coefficient); var rp = new RSAParameters(); rp.Modulus = rsaparams.Modulus.ToByteArrayUnsigned(); rp.Exponent = rsaparams.PublicExponent.ToByteArrayUnsigned(); rp.D = rsaparams.Exponent.ToByteArrayUnsigned(); rp.P = rsaparams.P.ToByteArrayUnsigned(); rp.Q = rsaparams.Q.ToByteArrayUnsigned(); rp.DP = rsaparams.DP.ToByteArrayUnsigned(); rp.DQ = rsaparams.DQ.ToByteArrayUnsigned(); rp.InverseQ = rsaparams.QInv.ToByteArrayUnsigned(); var rsaCsp = new RSACryptoServiceProvider(new CspParameters() { KeyContainerName = Guid.NewGuid().ToString(), KeyNumber = (int)KeyNumber.Exchange, Flags = CspProviderFlags.CreateEphemeralKey }); rsaCsp.ImportParameters(rp); x509.PrivateKey = rsaCsp; } Figura 3-24 Transformación de la llave privada Módulo de Trasportación La trasportación de los datos seguros es un punto importante a considerar cuando se está tratando con datos sensibles. Para lograr una transmisión segura, se hace uso del protocolo SSL que se implementa con la utilización de la biblioteca System.Net.Security, la cual contiene la clase SslStream, que es la encargada de autenticar los certificados y proveer transportación segura. La Figura 3-25 muestra el proceso de autenticación de certificados creados por el módulo de autoridad certificadora. Prototipo Página | 47 TcpClient client = (TcpClient)obj; try { Stream clientStream = client.GetStream(); using (SslStream sslStream = new SslStream(clientStream, false, (sender, x509Certificate, chain, errors) => true, null)) { try { sslStream.AuthenticateAsServer(_certificate, false, SslProtocols.Tls | SslProtocols.Ssl2 | SslProtocols.Ssl3, false); } catch (Exception ex){...} if (sslStream.IsAuthenticated) { var localEndPoint = (IPEndPoint) client.Client.LocalEndPoint; var remoteEndPoint = (IPEndPoint) client.Client.RemoteEndPoint; ProcessRawRequest(sslStream, localEndPoint, remoteEndPoint); } else throw new ArgumentException("SSL Not authenticated"); } } catch (Exception ex){...} Figura 3-25 Autenticando certificados con SSL WebDAV se utiliza para transportar los ficheros y para hacer operaciones indicadas por el usuario sobre ellos. Para ello se necesitan leer los pedidos del cliente y actuar en consecuencia. Dado que WebDAV añade a HTTP algunos métodos se deben hacer las implementaciones pertinentes para ellos. La Figura 3-26 muestra fragmentos de código dónde se usan éstos nuevos métodos. Prototipo Página | 48 case "COPY": { var currentPath = GetCurrentPath(basePath, context.Request.Url); if (IsLocked(context, currentPath)) break; "DELETE": var overwrite case = context.Request.Headers["Overwrite"] != null && { (context.Request.Headers["Overwrite"].ToLower() != "f"); var= currentPath = GetCurrentPath(basePath, context.Request.Url); var destinationPath GetCurrentPath(basePath, new if (IsLocked(context, UriKind.Absolute)); currentPath)) Uri(context.Request.Headers["Destination"], break; if (!overwrite && File.Exists(destinationPath)) bool handled = false; { if (Directory.Exists(currentPath)) SendHttpException(context, new CustomHttpException(412, "File exists")); { break; try } { Directory.Delete(currentPath, true); handled = true; } case "MKCOL": catch{...} { } = GetCurrentPath(basePath, context.Request.Url); var currentPath if (!handled && File.Exists(currentPath)) if (IsLocked(context, currentPath)) { break; File.Delete(currentPath); Directory.CreateDirectory(currentPath); handled = true; } context.Response.ContentLength64 = 0; context.Response.StatusCode = 201; context.Response.StatusDescription = "Created"; context.Response.WriteResponse(); break; } Figura 3-26 Métodos WebDAV Para la creación del xml compatible con WebDAV se hace uso de las clases XNamespace, XAttribute, XElement y XDocument las cuales se encuentran en la biblioteca System.Xml.Linq. Ejemplo del código utilizado se muestra en la Figura 3-27. XNamespace d = XNamespace.Get("DAV:"); var dXmlns = new XAttribute(XNamespace.Xmlns + "D", "DAV:"); string timeout = "Second-3600"; if (!string.IsNullOrWhiteSpace(context.Request.Headers["timeout"])) timeout = context.Request.Headers["timeout"]; var response = new XElement(d + "lockdiscovery", new XElement(d + "activelock", new XElement(d + "locktype", new XElement(d + "write")), new XElement(d + "lockscope", new XElement(d + "exclusive")), new XElement(d + "depth", 0), new XElement(d + "timeout", timeout), new XElement(d + "locktoken", new XElement(d + "href", currentLock.LockId)), new XElement(d + "lockroot", new XElement(d + "href", context.Request.Url)) )); var document = new XDocument(); document.Add(new XElement(d + "prop", dXmlns, response)); var content = Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + document.ToString(SaveOptions.DisableFormatting)); Figura 3-27 Formación de XML compatible con WebDAV Prototipo Página | 49 Módulo Interfaz de Usuario La interfaz de usuario consta de tres Layouts (vistas) exclusivamente. El primero de ellos es el que requiere la contraseña del usuario como parte de la autentificación de dos pasos (Figura 3-2). La contraseña se utiliza (además de para autenticarse) para cifrar un archivo XML de preferencias (preferences.xml). En él se guarda la contraseña de cifrado de los certificados digitales generados por el prototipo para habilitar SSL y el nombre del teléfono que especifique el usuario, que será también, el nombre de la autoridad certificadora. Este fichero se guarda dentro de la memoria del teléfono en la carpeta de la aplicación. Este fichero está cifrado usando el módulo de procesamiento. Los controles que se ven en este primer Layout dependen de si es o no la primera vez que se usa CryptoDROID. Al usarse por primera vez se debe especificar un nombre para el teléfono que será el nombre de la CA a su vez. También debemos poner la contraseña por primera vez. La Figura 3-28 muestra este primer paso. Figura 3-28 Priemer Paso CryptoDROID El segundo Layout es una pantalla de espera con una barra de progreso (splash) dónde CryptoDROID realiza, por detrás, las acciones de levantar el servidor web y WebDAV además de generar los certificados digitales (Figura 3-4). El último de estos Layouts, y un poco más complejo, es el que se muestra en la Figura 3-5. Este Layout primeramente muestra la huella digital que el usuario debe aceptar cuando hace las comparaciones de las huella digitales del certificado digital raíz, expuesto anteriormente. Prototipo Página | 50 Luego se muestra un nombre de usuario que se utiliza en el mecanismo de la autentificación de dos pasos. Este texto es generado aleatoriamente cada vez que cargue la aplicación. Finalmente en este Layout tenemos las posibles URL desde dónde se puede conectar el usuario a CryptoDROID. Resultados Página | 51 4 Resultados Algunos investigadores han hecho experimentos con dispositivos móviles comprobando la eficiencia de los mismos con diferentes algoritmos de cifrado. En [31], por ejemplo, se muestra el costo computacional y gasto de energía de dispositivos móviles, en particular, Personal Digital Assistants (PDA). El objetivo del presente trabajo es determinar la factibilidad del uso de los dispositivos Android como TPD y se han realizado pruebas experimentales, cifrando ficheros de diferentes tamaños midiendo el tiempo de trasmisión de estos a través de la Wifi, así como los tiempos de cifrado y descifrado. Para enviar los datos a través de la Wifi se han dividido los ficheros en pedazos de 512 y 1024 Kb. En estas pruebas se ha utilizado como dispositivo de experimentación un LG Nexus 4 y un Samsung Galaxy S4 I9505. En un primer experimento se han obtenidos los datos reflejados en la Tabla 4-1 dónde todos los procesos (trasmisión, cifrado y descifrado) se hacen secuencialmente. Tabla 4-1 Procesos Secuenciales (Tiempo en Segundos) FICHERO MB PEDAZO KB TIEMPO TRANSMISIÓN TIEMPO CIFRADO TIEMPO DESCIFRADO 10 512 10,700207 13,013372 13,692602 1024 12,058876 11,368568 10,850026 512 25,612569 35,089403 35,754266 1024 20,445324 29,583636 30,463215 512 46,822301 72,676688 72,723570 1024 34,827859 57,977663 60,66749 512 117,19555 160,18396 191,76817 1024 96,731922 145,74216 143,25981 512 159,84573 278,31695 305,89414 1024 209,85103 232,29126 232,22242 512 309,93109 540,45671 546,46130 1024 313,25476 477,81032 480,71711 512 701,67109 1155,7875 1224,5357 1024 664,96668 947,08605 965,89349 32 64 128 256 512 1024 En un segundo momento, se realizó un experimento similar, pero haciendo uso de la paralelización con el fin de explotar la capacidad multi-núcleo que brindan los dispositivos seleccionados para la experimentación. Como es de esperar, estos resultados son más alentadores, mejorando considerablemente los tiempos. Los mismos se muestran en la Tabla 4-2. Resultados Página | 52 Tabla 4-2 Procesos Paralelos (Tiempo en Segundos) FICHERO MB PEDAZO KB 10 512 1024 32 512 1024 64 512 1024 128 512 1024 256 512 1024 512 512 1024 1024 512 1024 TIEMPO TRANSMISIÓN TIEMPO CIFRADO TIEMPO DESCIFRADO 4,0228048 3,8419804 4,0693318 4,2270722 4,215069 4,3412256 12,286913 12,0682194 12,272882 12,3267226 12,0492597 13,0174481 23,5903803 23,5894773 26,0900268 23,9045025 23,897819 25,0175025 47,3620253 47,2744787 48,0567149 47,6968507 47,5494378 48,7462562 94,7632723 95,1144448 94,8198077 94,8572613 95,5489421 95,9584601 188,857015 195,3625435 190,0780195 189,7798195 188,6458115 190,028967 375,4802342 373,1416232 373,433388 374,8283404 373,1119809 374,4629174 De estas pruebas experimentales podemos deducir que el proceso de cifrado no afecta el rendimiento. Esto es debido a que el cuello de botella se forma en la trasmisión de los datos, ya que la velocidad promedio es de aproximadamente 2.5 Mb/s que depende de la velocidad de la Wifi que es de 56 Mbit/s (aunque ya existen dispositivos modernos con una mayor velocidad de 150 Mbit/s). Dado que el proceso de cifrado tarda aproximadamente lo mismo que el proceso de trasmisión de la información, en lo que llega un pedazo del fichero al dispositivo Android otro se va cifrando y así el tiempo de cifrado no perjudica el rendimiento. 4.1 CASOS DE USO Para ilustrar el funcionamiento de CryptoDROID se podrían utilizar varios escenarios, por ejemplo, para mantener información confidencial de clientes segura, tal como sus datos de contacto como teléfonos, emails, direcciones, etc. Otro ejemplo pudiera ser, mantener notas de algún proyecto de investigación protegidas de caer en manos de un plagiador. Sin embargo, la más ilustrativa, la más práctica y la de mayor alcance para todo tipo de usuarios es el caso de tener guardadas y seguras las contraseñas o documentos como contratos de bancos o tiendas, que contengan información de cómo acceder a servicios en línea. Siendo así, este es el caso de uso que expondremos a continuación. Hoy en día existen muchos servicios en la web y todos ellos requieren por lo general suscripciones y con ellas contraseñas. Un usuario promedio está inscrito en sitios para Resultados Página | 53 encontrar trabajo, para encontrar vivienda, en páginas para aprender idiomas, en una gran variedad de redes sociales y correos electrónicos. El médico y los bancos también necesitan registros los cuales conllevan a contraseña muchas veces difíciles de recordar pues se exigen contraseñas seguras (tamaño mayor a 8 caracteres y además combinar números, letras y caracteres especiales). Si adicionamos a esto, que las contraseñas de estos sitios no pueden ser la misma en todos los casos, pues si la de una página es descubierta se tendría acceso a todas las demás, tendríamos una cantidad considerable de contraseñas que recordar. Según un estudio de Microsoft realizado en el Reino Unido, un usuario gestiona unas 25 credenciales como promedio, de las cuales solamente 1 de cada 4 no se repiten [32]. La mayoría de los usuarios inexpertos escriben las contraseñas en papel y las llevan con ellos en la cartera o en documento de texto sin cifrar dentro de su dispositivo de almacenamiento externo. Esta es la estrategia más riesgosa pues quien encuentre este documento extraviado, está a un par de clics de distancia de hacerse con una cuenta bancaria. Servicios como Google o Facebook tienen métodos para ayudar al usuario a recordar sus contraseñas o a resetearlas con facilidad. Pero estos métodos no son fiables dado que en muchas ocasiones son preguntas personales del usuario, fáciles de adivinar. Una solución poco segura, sería permitir a los navegadores que guarden todas las contraseñas y el proceso de autentificación sería transparente para el usuario. Además de no recomendado, esto no es práctico ya que no siempre se utiliza el mismo navegador o el mismo dispositivo de conexión. Existen servicios en la nube que proveen métodos para esta problemática. Google por ejemplo, presenta este servicio donde sólo tienes que recordar la contraseña para acceder a un fichero con todas las demás. Pero tendríamos que confiar en la buena voluntad y honestidad del proveedor de servicio así como en su seguridad en cuanto a ataques. Existen también varias herramientas que guardan las contraseñas e incluso las resetea para el usuario. Pero tendríamos el mismo problema de que no es una solución práctica pues la mayoría de los usuarios tiene 3 dispositivos como promedio con los cuales acceder a sus cuentas. En un escenario como este es donde CryptoDROID podría surtir efecto, pues se tiene un fichero con todos los registros de los sitios, incluyendo su contraseña, y cada vez que el usuario necesite acceder a alguna de ellas, se conecta a CryptoDROID con el fin de poder acceder a sus registros. Otro uso interesante que se le puede dar a CryptoDROID, más allá de su función de cifrado, es el de poder utilizar al teléfono como memoria USB. Con la implementación de un servidor WebDAV, un usuario podría guardar archivos directamente en la memoria del Resultados Página | 54 teléfono sin necesidad del cable USB a través de la Wifi. En un ambiente desconectado como nuestro país, donde no se puede acceder de una forma transparente a los CSP, manejar ficheros desde el teléfono a través de la Wifi sería una aplicación práctica. Además se podría integrar directamente con herramientas de Office como muestra la Figura 4-1. Existen varias ventajas con esta integración. La primera y más evidente es que no habría que copiar el fichero de office que se quiere modificar en una ubicación extra. Directamente se abre el archivo cifrado y luego de las modificaciones pertinentes se cierra y se salva. Office se encarga de su sincronización. Figura 4-1 Integración con las herramientas de Office Conclusiones Página | 55 5 Conclusiones En nuestros días, es una necesidad la protección de información sensible como medida de seguridad obligatoria, debido a la gran cantidad de ataques existentes. Disponer entonces de un mecanismo fácil de utilizar, pero a la vez seguro y que no implique gastos adicionales, sería de gran utilidad. Esta propuesta podría ser una herramienta segura para la protección de los datos sensibles en los dispositivos Android de forma segura y portable, ya que viajarían junto a él por estar en el teléfono y podrían accederse en todo momento. Al estar cifrados utilizando la última tecnología (zona segura), se protegerían contra robo u otros tipos de ataques. Este trabajo muestra que el reemplazo de los TPD por teléfonos Android es posible siempre y cuando el usuario acepte las limitaciones que esto implica. La primera de ellas es la pérdida de la llave si se pierde o se le es sustraído el dispositivo, pero esta limitante también existe cuando se usa un TPD. Una ventaja en comparación con un TPD, es que se puede resguardar la llave privada mediante otro mecanismo y restaurarla en caso de pérdida o extravío, así como tener respaldo de la información cifrada en la nube. Otra limitante es la seguridad del canal de comunicación (con “barra verde”) que no es tan fácil de lograr, ya que habría que pagar servicios adicionales o realizar la verificación (instalación) del certificado digital manualmente. La última de las limitantes es la velocidad de trasmisión de los datos desde y hacia el dispositivo móvil, pues la velocidad de la Wifi que, aunque en los nuevos dispositivos es cada vez mayor, aún no se puede comparar con la de un dispositivo USB 3.0. Sin embargo, no usar el USB nos independiza de llevar el cable USB del teléfono junto con él y de necesitar el driver para que funcione en el dispositivo que se esté utilizando para acceder al móvil. Bibliografía Página | 56 Bibliografía [1] S. a. Z. J. a. L. D. a. J. J. Nepal, «A mobile and portable trusted computing platform,» EURASIP Journal on Wireless Communications and Networking, vol. 2011, nº 1, p. 75, 2011. [2] Y. C. a. R. K. Dejan Kovachev, «Mobile Cloud Computing: A Comparison of Application Models,» Information Systems & Database Technologies RWTH Aachen University , Ahornstr. 55, 52056 Aachen Germany, 2011. [3] P. G. Sujithra M, «Mobile Device Security : A Survey on Mobile Device Threats , Vulnerabilities and their Defensive Mechanism,» International Journal of Computer Applications (0975-8887), vol. 56, nº 14, pp. 24-29, 2012. [4] M. S. M. S. Karen Scarfone, «Guide to Storage Encryption Technologies for End User Devices Recommendations of the National Institute of Standards and Technology,» 2007. [5] L. O´Connor, «Celebrity Nude Photo Leak: Just One More Reminder That Privacy Does Not Exist Online and Legally, There’s Not Much We Can Do About It,» 2014. [En línea]. Available: digitalcommons.law.ggu.edu. [Último acceso: 28 01 2015]. [6] «BBC News,» 1 agosto 2012. [En línea]. Available: http://www.bbc.com/news/technology-19079353. [Último acceso: 24 enero 2015]. [7] R. a. C. R. Bhadauria, «A Survey on Security Issues in Cloud Computing». [8] C. W. K. R. a. W. L. Shucheng Yu, Achieving Secure, Scalable, and Fine-grained Data Access Control in Cloud Computing, IEEE INFOCOM: Dept. of ECE, Worcester Polytechnic Institute, Dept. of ECE, Illinois Institute of Technology, 2010. [9] Q. L. a. J. W. Guojun Wang, Hierarchical Attribute-Based Encryption for Fine-Grained Access Control in Cloud Storage Services, Changsha, Hunan Province, P. R. China: School of Information Science and Engineering, Central South University, 2010. [10] L. M. A. L. J. C. P. J. v. D. Frank C. Bormann, Concept for Trusted Personal Devices in a Mobile and Networked Environment. Bibliografía Página | 57 [11] Y. L. K. L. T. J. D. V. a. K. Y. Jaein Kim, «Vulnerability to Flash Controller for Secure USB Drives,» Soonchunhyang University, Asan, Republic of Korea. [12] A. Biryukov, «Known Plaintext Attack,» de Encyclopedia of Cryptography and Security, 2011, pp. 704-705. [13] A. a. O. P. C. V. Skillen, «Deadbolt : Locking Down Android Disk Encryption,» 2013. [14] K. a. S. S.Raju, «Overview of Dropbox Encryption in Cloud Computing,» Department of IT, Mahendra Engineering College, Namakkal, India, 2014. [15] V. Gough, «EncFs,» 2011. [16] R. M. A. S. Zhaohui Wang, «Implementing and Optimizing an EncryptionFilesystem on Android,» Department of Computer Science George Mason University Fairfax, USA, 2011. [17] R. Laboratories, «RSAES-OAEP Encryption Scheme,» RSA Security Inc, Bedford,MA 01730 USA, 2000. [18] M. a. V. J. Shand, «Fast implementations of RSA cryptography,» Computer Arithmetic, 1993. [19] R. Sandro, «A survey of key management for secure group communication,» ACM Computing Surveys, vol. 35, nº 3, pp. 309-329, 2003. [20] H. H. G. B. Y. J. Z. L. P. S. Xiaolei Li, «DroidVault: A Trusted Data Vault for Android Devices,» Department of Computer Science and Graduate School for Integrative Sciences and Engineering, National University of Singapore , Singapore , 2014. [21] N. I. o. S. a. Technology, «Announcing the ADVANCED ENCRYPTION STANDARD (AES),» Federal Information Processing Standards Publication 197 , USA, 2001. [22] J. K. D. W. D. W. C. H. N. F. T. K. M. S. Bruce Schneier, «"The Twofish Team’s Final Comments on AES Selection,» 2000. [23] R. Focardi, «Practical Padding Oracle Attacks on RSA,» Hakin9 - Defend Yourself! Hands-on Cryptography, 2012. Bibliografía Página | 58 [24] T. Cooijmans, Secure Key Storage and Secure Computation in Android, 2014. [25] J. d. R. a. E. P. Tim Cooijmans, «Analysis of Secure Key Storage Solutions on Android,» Radboud University Nijmegen , 2014. [26] ARM, «Building a Secure System using TrustZone Technology,» ARM Limited, 2009. [27] H. R. S. S. A. W. Nuno Santos, «Using ARM TrustZone to Build a Trusted Language Runtime for Mobile Applications,» Proceedings of the 12th Workshop on Mobile Computing Systems and Applications, Utah, USA, 2011. [28] F. Martin, «SSL Certificates HOWTO,» 2002. [29] D. B. a. A. Lioy, «Towards Simplifying PKI Implementation: Client-Server based Validation of Public Key Certificates,» Dip. Automatica e Informatica Politecnico di Torino, Torino, Italy, 2002. [30] N. W. Group, «HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV),» L.M. Dusseault, Editor, 2007. [31] H. a. H.-J. J. Rif`a-Pous, «Computational and Energy Costs of Cryptographic Algorithms on Handheld Devices,» Future Internet, vol. 3, 2011. [32] «BBC,» BBC Mundo, 23 mayo 2013. [En línea]. Available: http://www.bbc.co.uk/mundo/noticias/2013/05/130522_tecnologia_contrasenas _claves_internet_seguridad_dp. [Último acceso: 25 febrero 2015].