Quería incluir un cifrado sencillo simétrico (utilizando DES) con OpenSSL y además quería hacerlo para cada entrada enviada entre Cliente y Servidor y no por todo un bloque.
Como me gustó tanto este ejercicio, creé los siguientes scripts (que de preferencia recomiendo ejecutar en el orden en que son presentados):
- start_server.sh Inicia el netcat como escucha y envía la salida a un archivo (OUTPUT_FILE). Podrá notar que siempre que se corre este script, es vaciado el contenido del OUTPUT_FILE
- start_client.sh Comienza la lectura sigilosa de un archivo (de tipo PIPE*) utilizando el comando tail -f. Cada nueva entrada en este archivo (INPUT_FILE) será enviada al servidor haciendo uso de netcat.
- receiver.sh Este script y el mencionado seguidamente, son los encargados de tomar las entradas o salidas de netcat y cifrarlas o descifrarlas. En este caso, este script toma lo que ha recibido el servidor (OUTPUT_FILE) y lo descifra (puesto que dentro del mismo quedará el contenido cifrado)
- send.sh Este script permite enviar un mensaje desde el cliente al servidor, para lo cual utiliza el archivo INPUT_FILE, donde coloca el mensaje cifrado.
*: En el siguiente enlace podrá conseguir información bastante útil acerca de archivos FIFO.
En definitiva, los scripts start_server.sh y start_client.sh establecen la conexión TCP a través de netcat. Luego, los scripts send.sh y receiver.sh cifran y descifran los mensajes que viajarán entre cliente y servidor. Para utilizar estos scripts correctamente, deberá tener en el cliente los archivos start_client.sh y send.sh, y en el servidor, los archivos start_server.sh y receiver.sh.
Los scripts:
Script: start_server.sh
#!/bin/bash OUTPUT_FILE='output' PORT='1234' if [ $# -eq 2 ] then OUTPUT_FILE=$1 PORT=$2 elif [ $# -gt 0 ] then echo "Usage: start_server.sh [output_file port]" exit fi cat /dev/null > $OUTPUT_FILE && netcat -l -p $PORT > $OUTPUT_FILE
Script: start_client.sh.
#!/bin/bash SERVER='localhost' PORT='1234' INPUT_FILE='input' if [ $# -gt 3 ] then echo "Usage: start_client.sh [server] [port] [input_file]" exit else if [ $1 ]; then SERVER=$1; fi if [ $2 ]; then PORT=$2; fi if [ $3 ]; then INPUT_FILE=$3; fi fi if [ -p $INPUT_FILE ] then tail -f $INPUT_FILE | netcat $SERVER $PORT else echo "$INPUT_FILE isn't a pipe file. First, you may want to run: mkfifo $INPUT_FILE" fi
Script: receiver.sh
#!/bin/bash PASSWORD='1234' OUTPUT_FILE='output' if [ $# -gt 2 ] then echo "Usage: receiver.sh [output_file] [password]" exit else if [ $1 ]; then PASSWORD=$1; fi if [ $2 ]; then OUTPUT_FILE=$2; fi fi tail -f $OUTPUT_FILE | \ while read -r line do echo $line | openssl enc -d -a -des3 -pass pass:$PASSWORD done
Script: send.sh
#!/bin/bash PASSWORD='1234' INPUT_FILE='input' if [ $# -lt 1 ] || [ $# -gt 3 ] then echo "Usage: send.sh message [password] [input_file]" exit else if [ "$1" ]; then MESSAGE=$1; fi if [ $2 ]; then PASSWORD=$2; fi if [ $3 ]; then INPUT_FILE=$3; fi fi if [ -p $INPUT_FILE ] then echo $MESSAGE | openssl enc -e -a -salt -des3 -pass pass:$PASSWORD -out $INPUT_FILE else echo "$INPUT_FILE isn't a pipe file. Probably you don't have a server_client running" fi
Un ejemplo:
En una consola (Consola #1 - Servidor):
$ ./start_server.sh & $ ./receiver.sh
En otra consola (Consola #2 - Cliente):
$ mkfifo input $ ./start_client.sh & $ ./send.sh "primer envío"
No hay comentarios:
Publicar un comentario