TFG Alejandro de Bona Moliz
TFG Alejandro de Bona Moliz
TFG Alejandro de Bona Moliz
ALMACENAMIENTO AUTOMÁTICO EN LA
NUBE DE MEGA
i
ÍNDICE DE CONTENIDOS.
i
RESUMEN.
Este trabajo de fin de grado nace por mi interés en tener un nuevo acercamiento a la
seguridad informática y a los servicios de cloud computing vistos en la carrera. La
propuesta de realizar una aplicación/servicio que comprende desde, el uso de bases de
datos, hasta desarrollo con APIs, añadiéndole un componente de criptografía mediante
diversos métodos, fue una motivación para poder desarrollar muchas de las
competencias obtenidas durante mis estudios universitarios.
El objetivo principal de este trabajo es diseñar, implementar y poner a prueba una
aplicación que permita el almacenamiento y recuperación en la nube de almacenamiento
de MEGA.
Se trata de dos aplicaciones, una para el almacenado y otra para la recuperación, que
permitirán, a cualquier usuario que disponga de un ordenador con sistema operativo
Windows, mantener una copia segura de sus archivos en la nube de MEGA y
posteriormente descargar el archivo, sin que el usuario tenga que intervenir más que en
elegir el fichero deseado, la aplicación hará el resto. Las aplicaciones no requieren
instalación y están listas para usarse, solo será necesario configurar el servicio a gusto
del usuario.
El aspecto de la seguridad se aplica principalmente a la subida y descarga de los
ficheros, siendo el usuario el único que podrá conocer y hacer uso de los ficheros
almacenados, permitiéndole saber en todo momento que los ficheros que subió son
exactamente los mismos que está descargando.
ii
ABSTRACT.
This final degree project was born out of my interest in having a new approach to
computer security and the cloud computing services seen during my studies. The idea of
making an application/service that incorporate the use of databases, development with
APIs, adding a cryptography component through multiple methods, was a motivation to
develop many of the skills taken during my university studies.
The main goal of this project is to design, implement and test an application that allows
storage and recovery in the storage cloud of MEGA.
These are two applications, one for storage and the other one for recovery, which will
allow any user with a Windows system keeping a secure copy of their files in the
MEGA cloud, and then download the file. Without the user having to intervene just for
choosing the file wanted, the application will do the rest. The applications do not
require installation and are ready to be used, it will only be necessary to configure the
service as the user likes.
The security side is mainly applied to the upload and download of the files, being the
user the only one who will be able to know and use the uploaded files, allowing him to
know at all times that the files he uploaded are exactly the same ones that he is
downloading.
iii
1. INTRODUCCIÓN.
1
paso intermedio. Posteriormente podremos descargarlos obteniendo una copia del
original.
Para el desarrollo de la aplicación se usará la API [4] oficial de MEGA, que contiene los
métodos que se pueden usar con su interfaz, intentando usar el menor número de librerías
adicionales posible, con ello se pretende conseguir una implementación lo más
independiente, facilitando el mantenimiento. Con esto también se quiere conseguir una
aplicación multiplataforma con las menores modificaciones posibles.
Los objetivos principales para este proyecto son:
- Conocer el proceso que conlleva diseñar y desarrollar una aplicación mediante
buenas prácticas de programación para su fácil comprensión.
- Desarrollar una aplicación modular, fácil de ampliar y mantener de sus funciones.
- Aprender e implementar la API que aporta el servicio.
- Desarrollar una aplicación multiplataforma.
- Comprender los requisitos de la aplicación y la mejor forma de implementarla.
- Manejo de base de datos, incluyendo el desarrollo de pruebas de integridad
propias y cifrados externos a MEGA.
- Permitir al usuario elegir diferentes opciones de configuración.
- La instalación y el uso de la aplicación debe ser lo más sencillo posible.
2
2. ESTADO DEL ARTE.
Este capítulo se versará las distintas tecnologías utilizadas para el desarrollo del proyecto.
2.1. SQL.
2.2. MySQL.
Es un gestor de bases de datos relacionales de código abierto, que fue lanzado en 1995.
Esta entre los tres gestores de bases de datos más usados del mundo, junto con Oracle y
Microsoft SQL Server, además es el más usado de código abierto. [6]
Entre sus características principales [7] destacan:
- Velocidad y robustez. Portabilidad de sistemas.
- Permite persistencia.
- APIs disponibles en múltiples lenguajes.
- Un sistema de reserva de memoria muy rápido basado en threads.
- Soporta gran cantidad de tipos de datos para las columnas.
- Gran capacidad de almacenamiento y escalabilidad.
3
2.3. C++.
4
2.6. Crypto++.
La API de MEGA se apoya en diversas librerías externas, entre ellas crypto++, una
librería de código abierto compuesta de algoritmos criptográficos. Mediante esta librería
realizaremos todas las funciones criptográficas.
5
3. DISEÑO
3.1. Aplicación.
- Los programas nuevos pueden ser desarrollados en menos tiempo porque se puede
rehusar el código
Para el desarrollo usaremos Visual Studio 2017 en su versión C++, este nos permite
desarrollar fácilmente una solución modular, una fácil importación de las librerías
necesarias, incluido el SDK, y facilita la depuración del proyecto.
Como se mencionó en la introducción uno de los objetivos era hacer la aplicación lo más
modular posible. Por lo que se tomó el siguiente diseño de la solución
La solución se compone de 3 proyectos: “Downloader”, “Uploader”, “Utiles”. Los dos
primeros corresponden a las aplicaciones de bajada y subida de ficheros respectivamente,
son completamente independientes la una de la otra, esto nos permitirá ejecutar una
aplicación sin necesidad de hacer uso de la otra. En ambos proyectos se ha separado el
método principal (main) del resto de la aplicación.
Mientras que ambos referencian a “Utiles”, contiene los métodos que son comunes a
ambos proyectos.
6
Figura 6. Diseño de la solución.
7
Las aplicaciones están diseñadas de forma que cualquier usuario pueda poner en un
fichero .ini [11] todos los parámetros de configuración de la aplicación, este será
“Config.ini” [Figura 7]. Sólo tiene que abrirlo con un editor de texto y añadir los
parámetros necesarios. Aquí encontraremos cuatro secciones:
- MEGA. En esta sección están los parámetros para hacer el login en nuestra cuenta
de MEGA. MAIL y PASSWORD.
- PATHS. Aquí se encontaran todos los directorios que usarán las aplicaciones,
deben tener el formato que se muestra en el fichero de ejemplo:
C:\TFG\Tipo\
Las rutas de los directorios deben ser únicas para cada parámetro.
8
Los algoritmos de cifrado disponibles son: AES, IDEA, DES, BLOWFISH, RC5.
Todos ellos se usan en modo CBC [13].
El diseño de base de datos es muy sencillo, consiste en una única tabla, que almacena
todos los datos de los ficheros que subamos, para poder descargarlos posteriormente. Pese
ha su sencillez es clave en la aplicación puesto que contiene todos los datos para poder
descargar los ficheros. En caso de que se borraran los registros de la base de datos
perderíamos cualquier posibilidad de recuperarlos, porque, aunque físicamente si estarían
en la nube, no sabríamos cual son ni como descifrarlos. En este caso veríamos lo mismo
que cualquier usuario que tuviera acceso solo a nuestra cuenta de MEGA, ficheros con
datos incomprensibles.
El lenguaje escogido ha sido SQL porque para un sistema tan sencillo el sistema
tradicional funciona perfectamente, nuestras consultas en base de datos se basan en un
INSERT y varias SELECT, por lo que con SQL es muy fácil almacenar los datos de los
ficheros.
En cuando al gestor se ha elegido MySQL principalmente por:
- Es una base de datos gratuita. Al ser de código abierto, no tiene coste.
- Su facilidad de uso y rapidez.
- Pocos requerimientos y eficiencia de memoria.
Para mostrar la completa independencia de las aplicaciones se ha creado una base de datos
en red usando el servidor MySQL de db4free.net. Gracias al cual podemos demostrar la
modularidad del servicio, al tener la base de datos en red y dos aplicaciones
independientes, podremos tener cada una en una máquina diferente funcionando
simultáneamente subiendo ficheros en uno y bajándolos en otro. Pero se puede usar
cualquier gestor de base de datos, solo debemos ejecutar el script “Creación_Tabla.sql”
que se adjunta con la aplicación, en la base de datos que deseemos, la misma que hayamos
configurado en el “Config.ini”, esto creará una tabla t_ficheros que almacenará toda la
información de los ficheros:
- Nombre: Se trata del nombre original del fichero.
- Nombre cifrado: Nombre generado aleatoriamente con una longitud de 256
caracteres, es el nombre que tendrá el fichero en la nube.
- Path: Carpeta a la que se subirá el fichero en la nube.
- Hash_pre: Resultado de aplicar la función Hash elegida antes de cifrar el fichero,
se almacena en hexadecimal.
- Hash_post: Resultado de aplicar la función Hash elegida después de cifrar el
fichero, se almacena en hexadecimal.
9
- Clave: Parámetro de 16 bytes que se usa el algoritmo de
cifrado como clave.
- IV: Vector de inicialización [14]. Parámetro de 16 bytes
utilizado por el algoritmo de cifrado.
- Algoritmo_hash: Función Hash utilizada.
- Algoritmo_cifrado: Algoritmo cifrado usado.
- Size: Tamaño del fichero.
- Fecha_modificación: Es un parámetro que se introduce
automáticamente cuando se realiza la inserción con los
datos del fichero, indica de cuando son los dato.
Figura 8. Estructura tabla
t_ficheros.
10
4. DESARROLLO.
4.1. Aplicación.
4.1.1. Utiles.
4.1.1.1. Utiles.cpp
11
4.1.1.2. Bbdd.cpp
4.1.1.3. Seguridad.cpp
12
4.1.2. Uploader.
Esta aplicación se encargará de subir los ficheros a nuestra cuenta de la nube de MEGA.
13
Una vez se han cargado los parámetros se realiza el login.
Una vez hecho el login comenzará con la monitorización del directorio configurado.
Como consecuencia cualquier fichero que se meta en este directorio será detectado por la
aplicación y comenzará el proceso de subida.
14
Después de la detección del fichero el siguiente paso será
comprobar el directorio de la nube de MEGA que
corresponde al nuevo fichero, este parámetro se almacenará
en un objeto Fichero creado al principio del proceso.
15
El tratamiento del fichero consiste en cuatro pasos:
- Cálculo del Hash: Con el la función Hash definida en el fichero de configuración,
la aplicación calculará el Hash y el resultado lo guardará en él objeto de tipo
fichero.
- Cálculo del Hash: Se volverá a calcular el Hash esta vez del fichero cifrado, para
certificar la integridad del fichero y, en caso de fallar, saber en qué momento ha
sido alterado. Se llevará acabo con la misma función Hash que el anterior cálculo
y como en los pasos anteriores este resultado también se almacenará.
- Generación del nombre aleatorio: Se generará una cadena de 256 caracteres que
sustituirán al nombre original del fichero.
En este punto ya tendremos todos los parámetros del fichero que se va a subir, todos ellos
están recogidos en el objeto, este se pasará al método que almacenará las credenciales del
fichero en base de datos, será la base de datos la encargada de insertar la fecha y hora de
subida del fichero.
Por último, se llevará a cabo la subida del fichero mediante el método proporcionado por
la API de MEGA.
16
Figura 18. Diagrama de flujo subida fichero.
Para garantizar la correcta subida del fichero se usará un código de detección de errores
llamado CRC [16], verificación por redundancia cíclica, que permite detectar cambios
accidentales en los datos.
Para ello calcularemos el código que genera el fichero en local, después del cálculo se
procederá a subir el fichero, este proceso cuenta con una barra de progreso que nos indica
el estado de la subida.
Una vez termine el proceso de subida comprobaremos de nuevo el CRC que genera el
fichero que, almacenado en la nube, en caso de que coincidan la subida habrá sido
correcta, en caso negativo, la aplicación devolverá un mensaje avisando de la situación.
Al finalizar se eliminará el fichero de la maquina para evitar que se pueda tener
conocimiento de los ficheros que se encuentran en MEGA.
17
Figura 20. Registros fichero MEGA.
4.1.3. Downloader
El downloader se encarga, como su propio nombre indica, de las descargas de los ficheros,
pero además también ofrece la opción de borrar los ficheros almacenados. Los ficheros
que se usarán por esta aplicación deberán haber sido subidos previamente mediante la
aplicación uploader, cualquier fichero subido de otro modo será ignorado por la
aplicación.
18
Se trata de un proceso lineal como podemos observar en el siguiente diagrama:
19
En esta situación podemos encontrarnos tres casos:
- Que el nombre introducido no exista en la base de datos, en cuyo caso la
aplicación nos lo indicará y solicitará otro nombre.
- Que exista más de un registro en la base de datos que coincida con el nombre
introducido, en este caso nos mostrará los registros cuyos nombres coincidan, con
un id asociado. Mediante el id seleccionaremos el fichero deseado. También existe
la posibilidad de Volver para seleccionar otro fichero.
- Que solo exista un registro que coincida con el nombre introducido, en cuyo caso
no hará falta seleccionar el fichero.
A continuación, en los casos en los que ya dispongamos del fichero a usar, nos dará la
posibilidad de descargar el fichero, de borrarlo o de volver al principio del proceso y
buscar otro fichero.
20
4.1.3.1. Borrar.
21
La opción de descargar permite obtener una copia del fichero que se encuentra en la nube
de MEGA y descifrarlo obteniendo una copia del fichero original.
Una vez seleccionado el fichero, se realizará una nueva consulta a base de datos para
obtener los parámetros para realizar la descarga. Tras realizar este proceso el siguiente
paso será descargar el fichero de nuestra cuenta de MEGA, haciendo uso del método
proporcionado por la API y en el directorio configurado, este estará cifrado todavía. La
duración del proceso dependerá del tamaño del fichero y de nuestra conexión, para
conocer el progreso dispondremos de una barra que nos indicará el estado de la descarga.
Para comprobar la integridad del fichero se calculará la función Hash del fichero, esta
función será la misma que se empleó durante la subida. Compararemos el resultado con
él almacenado en base de datos, en caso de no coincidir, se borrará el fichero y devolverá
un error. En caso contrario continuará con el proceso.
En este momento se procederá a descifrar del fichero, como con la función Hash,
obtendremos el algoritmo con el que fue cifrado el fichero, y además recuperaremos las
claves usadas por este. Con el fichero descifrado volveremos a calcular el hash, esta vez
del fichero descifrado, en caso de no coincidir con el almacenado borrará el fichero y
devolverá un mensaje de error, en el caso favorable concluirá la descarga del fichero
devolviendo un mensaje favorable y solicitando la introducción de un nuevo fichero.
22
En caso de que existiera un fichero con el mismo nombre en la carpeta de descarga lo
sobrescribirá, esto sucede para evitar el llenado de la carpeta, por lo que se recomienda
usar este directorio de manera temporal.
Al igual que en el uploader cualquier cierre de la ventana provocará un cierre de nuestra
sesión en MEGA.
También se continuará con la política de mantener activa la aplicación siempre que esta
se haya inicializado correctamente la aplicación.
Al igual que el diseño el desarrollo de la base de datos ha sido muy sencillo, después de
establecer todo lo que iría en la tabla, solo quedaba elaborar un script que la creara,
conociendo lo que contendría cada columna solo quedaba elegir los tipos de estas.
Como se ha visto anteriormente el objeto contiene todos los valores que se van a insertar
en base de datos, por lo que se ha implementado una configuración en la que no se pueden
insertar valores null, esto no debería suceder ya que en caso de que los valores fueran null
el error debería producirse antes, pero si se diera el caso devolvería un error al guardar
las credenciales del fichero.
La fecha de modificación se inserta automáticamente al almacenar el registro y es la que
se recupera a la hora de devolver los ficheros iguales en el downloader.
Por último, se ha utilizado el servidor de bases de datos gratuito que proporciona
db4free.net, solo crear la cuenta obtienes unos parámetros para poder conectar con el
servidor, solo es necesario ejecutar en el servidor el script de creación de la tabla y añadir
los parámetros al fichero config.ini
23
5. RESULTADOS
En esta sección analizaremos los resultados obtenidos una vez concluido el proyecto.
El más evidente, las aplicaciones. Se han desarrollado dos aplicaciones, una para subidas
de ficheros y otra para descargas, estas aplicaciones son completamente portables e
independientes, se trata de unos ficheros de apenas unos megas. No requieren instalación,
el único requerimiento es configurar el fichero de configuración “Config.ini”.
Si se usa un servidor de base de datos en red bastará con ejecutar la aplicación deseada y
seguir los pasos que se muestran en pantalla. En caso contrario debemos tener también
instalado el gestor de bases de datos correspondiente.
La aplicación se ha diseñado para que su mantenimiento sea muy sencillo, la separación
en múltiples métodos nos permitirá saber en cual se produce un hipotético fallo, además,
la ampliación del diseño de la aplicación sería muchos más sencilla.
Estos eran los objetivos principales del proyecto, a los que se les suman:
- Implementar la API de MEGA.
- Minimizar el uso de librerías externas, solo ha sido necesario añadir una librería,
y esta es la del conector MySQL. Aprovechando las librerías de las que ya hace
uso MEGA para su propia implementación.
- Todo el tratamiento del fichero se realiza sin conocimiento de MEGA lo que hace
que no intervengan para nada en el fichero original, solo se usa como servicio de
almacenamiento.
24
6. CONCLUSIONES.
25
7. TRABAJOS FUTUROS.
Toda aplicación tiene margen para la mejora, ya sea para implementar nuevas
funcionalidades o para fortalecer las debilidades. En esta aplicación se podrían realizar
mejoras como:
- Una aplicación que cifrara las contraseñas de nuestras cuentas para después
ponerlas en el config.ini. Aun que el fichero se encuentra en local y depende de la
seguridad de los equipos en los que se encuentre, tener las contraseñas en un
fichero de texto plano supone un riesgo a la seguridad. Esta aplicación cifraría la
contraseña con una clave desconocida por cualquier usuario, pero conocida por
nuestras aplicaciones, que sustituiría a la que se encuentra en el fichero. Esto
evitaría el conocimiento de las contraseñas por parte de cualquier persona
simplemente mirando el fichero.
26
8. BIBLIOGRAFÍA.
27
[9] SDK de MEGA
https://github.com/meganz/sdk
[13] Descripción de los modos de cifrado entre los que se encuentra CBC.
http://ocw.bib.upct.es/pluginfile.php/5310/mod_resource/content/1/MODOS_DE_OPE
RACION_CIFRADO_BLOQUES.pdf
28
Este documento esta firmado por
Firmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,
C=ES
Fecha/Hora Wed Jun 06 21:14:13 CEST 2018
Emisor del EMAILADDRESS=camanager@fi.upm.es, CN=CA Facultad de
Certificado Informatica, O=Facultad de Informatica - UPM, C=ES
Numero de Serie 630
Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (Adobe
Signature)