Simón Bolívar University - CI6352 - Cryptography and Data Security - Access Control
El ejercicio se basa en programar una versión segura y una insegura de una aplicación cliente-servidor que solicita datos privados por la red, y verificar el funcionamiento de cada una con un analizador de tráfico. Los programas se desarrollarán en C.
Cuando un cliente se conecta al servidor, éste retorna un mensaje solicitando 'nombre de usuario', espera la respuesta, y luego envía 'clave'. El servidor debe tener un archivo con los usuarios y sus claves para poder verificarlo.
Si el usuario existe en el sistema y la clave es correcta, el servidor responde con un mensaje 'Usuario autorizado'; en caso contrario debe responder 'Acceso denegado'.
Las claves de los usuarios deben guardarse utilizando algoritmos criptográficos con el fin de disminuir las posibilidades de violación de seguridad.
Archivo | Descripción |
---|---|
add_users.c | Ejecutable para añadir nuevos usuarios a la base de datos |
certificate.crt | Certificado auto-firmado del servidor |
client.h | Header del archivo client.c |
client.c | Funciones comunes de ambas versiones del cliente |
common.h | Header del archivo common.c |
common.c | Funciones comunes para todos los archivos |
insecure_client.c | Versión insegura del cliente, utilizando la librería sockets con TCP |
insecure_server.c | Versión insegura del servidor, utilizando la librería sockets con TCP |
Makefile | Makefile de la aplicación |
privateKey.key | Clave privada del servidor |
secure_client.c | Versión segura del cliente, utilizando la librería OpenSSL con TLS |
secure_server.c | Versión segura del servidor, utilizando la librería OpenSSL con TLS |
server.h | Header del archivo server.c |
server.c | Funciones comunes de ambas versiones del servidor |
users_db | Base de datos de usuarios con sus respectivas contraseñas |
user_management.h | Header del archivo user_management.c |
user_management.c | Funciones para la gestión de usuarios |
Para instalar el software primero debemos descomprimir el archivo en formato .tar.gz
mediante:
tar -xvf ProyectoOpenSSL.tar.gz
Para compilar el código en OS basado en linux, deberemos posicionarnos en la carpeta ProyectoOpenSSl y luego ejecutar el comando:
make
Luego se producirán cuatro ejecutables correspondientes a las versiones seguras e inseguras tanto del cliente como del servidor:
insecure_client
secure_client
insecure_server
secure_server
El comando utilizado para generar el certificado autofirmado es:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
Donde:
- -x509: Tipo de certificado solicitado.
- -nodes: La clave privada generada para este certificado no se guardara cifrada.
- -days: Número de días de validez del certificado.
- -newkey: Algoritmo de clave pública utilizado, así como la longitud de la clave generada.
- -keyout: Especifica el nombre del archivo donde se guardara la clave.
- -out: Especifica el nombre del archivo donde se guardara el certificado.
Los comandos para ejecutar cliente y servidor, son:
acceso-rem-seg -s [ip-servidor] -p [puerto-servidor]
acceso-rem -s [ip-servidor] -p [puerto-servidor]
Donde ip-servidor
es el IP de la máquina y puerto-servidor
el puerto donde está conectacdo el servidor.
serv-acceso-seg -p [puerto]
serv_acceso -p [puerto]
Donde puerto
es el número del puerto por el que atiende peticiones el servidor.
- La elaboración del código se nutrió de la información presentada en los siguientes enlaces:
- Si la opción está habilitada, en la base de datos de los usuarios, se almacena el resumen criptografico de sus respectivas contraseñas en vez de lo contraseña per se. Así, cuando se desea autenticar a un usuario, se calcula el resumen criptográfico de la contraseña recien introducida con aquel almacenado en la base de datos. Si coincide, entonces, se concede acceso. Si no, se deniega el acceso. La función utilizada para calcular tales resúmenes es SHA512.