Índice
Las copias de seguridad son algo que debemos tener a buen resguardo por si algún dia le ocurre algo a nuestros datos. Si bien lo anterior es cierto, de igual modo hemos de tener bien protegidas éstas copias de seguridad para que no puedan ser usadas por terceros de caer en manos maliciosas. Hoy veremos cómo cifrar archivos con openssl.
Generar las claves públicas y privadas
Al igual que en GPG, necesitaremos generar un par de claves, pública y privada, para poder cifrar archivos con openssl:
$ openssl genrsa -out clave.pem 4096
$ openssl rsa -in clave.pem -out clave.pub.pem -outform PEM -pubout
Con el primer comando generamos la clave, en clave.pem se encuentran tanto la clave privada como la pública, con el segundo comando extraemos la pública a un archivo distinto.
Método elegido para cifrar los archivos
El sistema de claves pública/privada no puede cifrar archivos de gran tamaño. Por tanto usaremos un cifrado simétrico para el cifrado normal. Cada vez que cifremos un fichero se usará una clave simétrica generada aleatoriamente. Esta clave simétrica es la que cifraremos de forma asimétrica con la llave pública que hemos generado con los comandos de arriba. En resumen:
Para cifrar los archivos
- Generamos una clave aleatoriamente, de gran longitud (40-50 caracteres por ejemplo).
- Ciframos el archivo con la clave generada en 1.
- Ciframos la clave generada en 1 con nuestra clave pública.
Para descifrar los archivos
- Desciframos la clave generada en 1 y cifrada con la llave pública en 3
- Desciframos el archivo con la clave que acabamos de descifrar en 1
Aplicar los pasos con openssl
Ahora procedemos a aplicar los pasos descritos anteriormente con openssl:
Cifrando los archivos
# Paso 1, generar clave aleatoria
$ openssl rand -base64 48 -out key.txt
# Paso 2, cifrar el archivo con la clave simétrica
$ openssl enc -aes-256-cbc -pass file:key.txt -in archivoSINcifrar -out archivoCIFRADO.encrypted
# Paso 3, cifrar la clave generada en el paso 1 con la llave pública
$ openssl rsautl -encrypt -in key.txt -out key.enc -inkey clave.pub.pem -pubin
Los argumentos significan:
- enc -aes-256-cbc: Tipo de cifrado simétrico.
- -pass file:key.txt: La clave con la que cifrar el archivo.
- -in: Fichero de entrada.
- -out: Fichero de salida.
- rsautl: Indica que vamos a usar RSA para firmar, verificar, cifrar o descifrar.
- -encrypt: Encriptar el fichero de entrada con una llave RSA pública.
- -inkey: Llave con la que cifrar
- -pubin: Indica que vamos a firmar con una llave pública.
Descifrado de archivos
# Paso 1, desciframos la clave generada en 1 y cifrada con la llave pública en 3
$ openssl rsautl -decrypt -inkey ./clave.pem -in key.enc -out key.txt
# Paso 2, Descifrar el archivo con la clave
$ openssl enc -aes-256-cbc -d -pass file:key.txt -in archivoCIFRADO.encrypted -out archivoSINcifrar
Donde:
- -d: Descifra los datos de entrada.
Script para descifrar varios archivos de una vez
Como suele ser habitual, los scripts bash nos facilitan las tareas repetitivas, con los comandos de arriba, es trivial escribir un script que automatize el proceso de descrifrar todos los archivos de un directorio:
#/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <directorio a="a" los="los" archivos="archivos" cifrados="cifrados">"
exit
fi
openssl rsautl -decrypt -inkey ./clave.pem -in "$1/key.enc" -out "$1/key.txt"
echo "openssl rsautl -decrypt -inkey ./clave.pem -in \"$1/key.enc\" -out \"$1/key.txt\""
OIFS="$IFS"
IFS=$'\n'
for i in `find $1 -type f -name "*.encrypted"`
do
echo "Decrypting $1/$i"
openssl enc -aes-256-cbc -d -pass file:"$1/key.txt" -in "$i" -out $1/$(basename "$i" .encrypted)
done
IFS="$OIFS"
Espero que os sea de utilidad.
Referencias
- Encrypt tar.gz file on create »» askubuntu.com
- how to encrypt a large file in openssl using public key »» stackoverflow.com
- Documentación oficial de openssl »» Visitar sitio
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.