seniorbeto / Criptografia_2023-24

Apache License 2.0
0 stars 1 forks source link

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:

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.

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 )

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

Anexo

Link al repositorio

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