Skip to content
This repository has been archived by the owner on May 31, 2024. It is now read-only.

Continuación del proyecto original. El propósito general de la aplicación es encriptar localmente secciones de imágenes que se almacenan en un servidor.

License

Notifications You must be signed in to change notification settings

Ragarr/Criptografia_2023-24

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Memoria de la entrega 2

Criptografía y Seguridad Informática

Raúl Aguilar Arroyo

Alberto Penas Díaz

Grupo 8001

Índice

Propósito de la aplicación

El propósito general de la aplicación es encriptar localmente secciones de imágenes que se almacenan en un servidor.

Estructura de la aplicación

La aplicación está compuesta de dos partes muy diferenciadas, el lado del cliente y el lado del servidor.

Lado del cliente

Este es el encargado de encriptar las imágenes y almacenar (mientras dure la sesión) la contraseña del usuario. También es el encargado de enviar correctamente las imágenes y la información al servidor. Esta parte se divide a su vez en 3 componentes:

  • Interfaz de usuario (UI):
    • Es simplemente la interfaz gráfica contra la que interactúa el usuario, está recopila las entradas, se las manda al cliente y muestra las imágenes e información que el cliente le proporciona.
  • Cliente:
    • Se encarga de enviar la información al servidor y a la interfaz gráfica, así como de hacer las solicitudes al servidor. Proporciona las funciones a las que tiene acceso el usuario.
  • Paquete Image Crypto Utils (ICU):
    • Es el encargado de encriptar y desencriptar imágenes, así como de generar los MAC de las mismas.

Lado del servidor

Este es el encargado de autenticar a los usuarios y de administrar las imágenes que se suben. A nivel lógico se divide en servidor y la base de datos.

  • Servidor:
    • Es el encargado de autenticar a los usuarios, exigir la robustez de las contraseñas, la generación de KDFs de las contraseñas para su almacenamiento y la verificación de la originalidad de las imágenes proporcionadas
  • Base de datos:
    • Es la encargada de administrar la localización y búsqueda tanto de imágenes como de la información de los usuarios.

Autoridades de Acreditación

Hemos creado una serie de autoridades que se encargan de firmar los certificados que utilizan el servidor y el cliente (se explica en la página 4 )

  • El Papa: Es la autoridad máxima y se autoafirma su certificado.
  • Pedro Sanchez y Ursula (von der Leyen) que certifican cliente y al servidor respectivamente

Se indaga más profundamente en el funcionamiento de la aplicación en la página

Firma Digital

Utilizamos la firma digital para acreditar cada una de las imágenes que envía el cliente al servidor. De esta manera, aportamos a ésta comunicación un método para verificar la identidad del cliente así como el “no repudio”. Hemos decidido emplear el método de cifrado RSA para firmar el hash de autenticación de imágen (véase la memoria de la primera entrega), de esta manera, el cliente envía directamente al servidor una tupla con la siguiente información:

  1. hash: resumen de la imagen previamente encriptada utilizando como generador una clave de 32 bytes generada aleatoriamente, el nonce y el salt.
  2. key: la clave que se ha utilizado para generar el resumen de la imagen.
  3. signature: el hash encriptado con la clave privada del usuario.

De esta forma, el servidor, haciendo uso de la clave pública del usuario (que el mismo hace llegar al servidor a través del certificado) es capaz de comprobar que, efectivamente, el hash de la imagen coincide con el resultado de descifrar la signature con la clave pública del cliente.

Es conveniente explicar que este par de clave pública y clave privada se renueva cada vez que se empieza una nueva comunicación entre cliente y servidor.

Certificados de clave pública

Infraestructura de clave pública

Consta de 3 niveles (aunque por la implementación es sencillo escalar a tantos niveles como se quiera), hemos designado al Papa como CA raiz y a Pedro Sanchez y Ursula Von Der Lien como autoridades subordinadas.

Los usuarios finales son el cliente y el servidor, cuya única autoridad en común es el CA raíz.

Por lo tanto cuando se verifican los certificados siempre acaban acudiendo a la CA raíz.

Generación de certificados y PKs

La generación de certificados y claves públicas se lleva a cabo de la siguiente manera.

Primero el CA raíz emite su certificado autofirmado después los CA subordinados emiten un csr firmado por ellos en el que adjuntan su clave pública y alguna otra información. Esta solicitud se envía a la autoridad superior, en este caso el Papa, el cual “revisa”(de forma conceptual) la solicitud y les genera un certificado firmado por el. Este certificado se guarda junto al certificado de la autoridad que lo ha firmado (para simplificar luego el proceso de buscar autoridades comunes).

Un usuario final (el servidor y el cliente) solicita los certificados a sus respectivas autoridades seleccionadas. Y al igual que antes se genera un csr que se envía a la autoridad, la cual lo “revisa” y firma.

A nivel implementación hemos incluido un certificado dentro de otro de forma recursiva para simplificar la búsqueda de autoridades comunes

Para los procesos que lo requieren, las claves públicas siempre se obtienen de los certificados y siempre que se recibe un certificado (ya sea cliente o servidor) se verifica la validez de este y que haya sido emitido por una autoridad de confianza.

Complejidad y código de la aplicación

Consideramos que nuestra aplicación es considerablemente compleja, en lo que a su funcionamiento interno se refiere. Hemos preferido afianzar una correcta y potente implementación de nuestros conocimientos en lugar de centrarnos en la parte estética de la misma. De esta manera, hacemos que sea muy fácil extender el código en el futuro y que quede muy claro cuál es la estructura de nuestro código, el cual podría ser modelizado resumidamente de la siguiente manera:

En el diagrama, se puede contemplar cómo es posible obtener imágenes del servidor desde la ventana principal así como desde la ventana de usuario, esto es porque es posible pedir imágenes al servidor a través del cliente sin haberse autenticado inicialmente, de esta forma, el cliente dará a la interfaz las imágenes tal y como se las ha entregado el servidor, es decir; encriptadas. Cabe destacar, además, que es notable cómo no es posible que ninguna imagen salga del lado del cliente sin encriptar.

Además ha sido necesario implementar algunos patrones de diseño como singleton para las clases de las autoridades.

Mejoras

  • Tratamiento de imágenes
  • Almacenamiento en base de datos
    • Almacenamiento de imágenes
    • Almacenamiento de claves/usuarios
  • Validación de datos introducidos por el usuario
  • Rotación de claves
  • Sistema de logs
  • Cifrado simétrico Y asimétrico
    • Todas las operaciones de login, register y auth usan RSA
    • El encriptado de las imágenes usa AES y RSA
  • Interfaz gráfica
    • Pantallas de carga
    • Ventanas emergentes
    • Control de errores
    • Selección de región a encriptar
    • Capacidad de eliminar y añadir usuarios

Anexo

Link al repositorio

https://github.com/Ragarr/Criptografia_2023-24

About

Continuación del proyecto original. El propósito general de la aplicación es encriptar localmente secciones de imágenes que se almacenan en un servidor.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%