FPCrypt
1. Introducción.
FPCrypt es una aplicación para cifrar y descifrar ficheros mediante huellas dactilares.
Este incluye un dispositivo de lectura de huellas dactilares que permite leer las huellas dactilares del usuario, así como el software de gestión de huellas y cifrado/descifrado de ficheros.
La idea principal de este proyecto es poder cifrar y descifrar un fichero de forma segura y sin tener que acordarse de la contraseña que has utilizado ya que la propia contraseña está en tu mano.
2. Implementación.
Para poder llevar a cabo este proyecto hemos usado la placa Arduino UNO, un lector de huellas dactilares FPM10A cables para conectar el lector de huellas dactilares y un cable USB para conectar la placa con el ordenador.
El software está programado en C# con el IDE Visual Studio 2022 Community, sistema de interfaces Windows Form.
3. Reparto de tareas.
Para organizar correctamente el proyecto hemos creado un repositorio de GitHub, usando la metodología GitHub Flow en este repositorio hemos desarrollado el código del software así como el propio código de la placa.
Se han planteado una serie de casos de uso y componentes del propio software y posteriormente creado los issues correspondientes, su rama y pull request asociada.
Cada integrante tiene dos issues asignados para que realicen en solitario, también existen algunos que están asignados para varios integrantes del grupo.
El reparto se ha realizado de manera que haya independencia entre las distintas ramas y se pueda trabajar de manera individual entre los integrantes del grupo, aumentando considerablemente la eficiencia.
La parte de hardware se ha realizado la mayor parte del tiempo en las clases de prácticas, ya que la mayor carga de trabajo estaba en el software y no en el hardware.
4. Coste de materiales.
El material que hemos tenido que comprar a parte ha sido el sensor de huellas dactilares que ha costado 24€. También hemos tenido que comprar unas tijeras, por el valor de 1€ y un bote de pintura negra, que ha costado 2.25€.
Producto | Precio |
Sensor de huellas dactilares (FPM10A) | 24€ |
Tijeras | 1€ |
Pintura | 2.5€ |
Total | 27.5€ |
5. Hardware.
El hardware está compuesto por la placa Arduino UNO, un lector de huellas dactilares FPM10A, cables para conectar el lector de huellas, el cable USB y una caja protectora.
En Arduino hemos programado la placa para que esté a la espera de recibir la orden de lectura de una huella, una vez ha conseguido leerla la enviará al ordenador.
Existen dos secciones de código definido en la placa de Arduino, la primera parte se encarga de la comunicación ordenador-Arduino y la segunda se encarga de la comunicación Arduino-escáner.
Para la primera sección, hemos usado un sistema de ordenes/comandos. Arduino se queda esperando una orden que llegue del serial. Cuando recibe una orden actúa en consecuencia. Las ordenes disponibles son:
- Registrar una huella
- Escanear una huella
- Borrar una huella
- Borrar todas las huellas
- Mensaje de control
La mayoría de estas órdenes requieren de comunicación entre el Arduino y el escáner. Para ello, hemos creado una clase que abstrae esa parte de la comunicación. Esta clase se corresponde con la segunda sección de código.
Para visualizar el código relacionado con el hardware en el repositorio podéis hacer click aquí
6. Software.
El software está compuesto por distintos módulos que realizan su función de manera coordinada con la interfaz de usuario.
Podemos dividirlos en las siguientes partes:
6.1. Front.
La interfaz de usuario está implementada con el framework de Windows Form, es una interfaz básica que permite al usuario añadir huellas dactilares o borrarlas y cifrar/descifrar ficheros.
En el caso de que haya sucedido algún error se le notificará mediante una ventana modal.
6.2. Back.
Esta parte es el alma del proyecto, contiene distintos módulos:
6.2.1. Módulo de cifrado.
Este módulo incluye dos clases que permiten cifrar y descifrar ficheros dada una huella dactilar.
Al cifrar el fichero se cambiará la extensión de este, también se comprueba si el fichero cifrado no se puede descifrar con la huella dactilar introducida.
El sistema criptográfico utilizado es AES256, hemos creado una clase que usa la API de C# y nos abstrae de algunos detalles de bajo nivel para hacer más sencilla esta tarea.
6.2.2. Módulo de comunicación.
Mediante este módulo podemos comunicarnos con la placa para poder enviar ciertas “órdenes” y recibir los datos, es capaz de auto detectar el puerto del ordenador donde está conectado Arduino y es uno de los ejes centrales del proyecto.
6.2.3. Módulo de la contraseña maestra.
Para proteger que alguien pueda abrir el programa sin consentimiento hay que introducir una contraseña maestra del programa al abrirlo, este módulo se encarga de guardar dicha contraseña y realizar las comprobaciones necesarias cuando el usuario la introduce.
6.2.4. Módulo de las huellas dactilares.
Este módulo permite guardar las huellas dactilares que se han registrado, así como eliminarlas.
Tanto el módulo de cifrado como el de contraseña maestra y huellas dactilares usan clases que siguen el patrón de diseño singleton con persistencia de datos mediante serialización.
El funcionamiento del programa ha sido comprobado mediante pruebas unitarias usando el framework de MSUnit, algunos de los integrantes del grupo han seguido la metodología TDD para crear estos módulos.
Para ver el repositorio del proyecto pulsar aquí.
7. Funcionamiento.
Al abrir el programa se nos pedirá introducir la contraseña maestra o crearla, una vez introducida se nos mostrará la pantalla principal del programa donde podemos añadir o borrar huellas dactilares, así como cifrar y descifrar ficheros, en la misma pantalla podremos visualizar las huellas dactilares que hemos registrado previamente.
También podremos cambiar la contraseña maestra.
8. Problemas y soluciones.
A la hora de crear el módulo de cifrado hemos tenido problemas a la hora de manejar la API de C#, por lo que se nos ocurrió el crear una clase que nos pudiera abstraer de la cantidad de detalles necesarias para simplemente realizar un cifrado y descifrado.
También ha sido algo complejo serializar correctamente la información de las huellas dactilares ya que a veces no se restauraban correctamente.
Otro problema muy grande ha sido la comunicación con Arduino, muchas veces no se envía correctamente la información en el puerto serial haciendo difícil saber si el dispositivo está correctamente conectado y si ha recibido la información correctamente.
Lo hemos podido solventar usando ciertos mecanismos de sincronización y usando bucles con un tiempo límite.
Ha habido ciertos problemas sin solución, como por ejemplo la detección del lector de huellas, es manejado por la librería del fabricante y no podemos hacer mucho por solucionarlo.
También había veces que no conseguíamos leer bien las huellas, lo cual es una limitación del propio lector de huellas.
9. Información adicional.
- Link del repositorio de GitHub: https://github.com/SeXde/FPCrypt
- Link al código de Arduino: https://github.com/SeXde/FPCrypt/tree/main/FPCrypt/Arduino/ArduinoCode/ArduinoUno