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.

Índice



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
  1. Generamos una clave aleatoriamente, de gran longitud (40-50 caracteres por ejemplo).
  2. Ciframos el archivo con la clave generada en 1.
  3. Ciframos la clave generada en 1 con nuestra clave pública.
Para descifrar los archivos
  1. Desciframos la clave generada en 1 y cifrada con la llave pública en 3
  2. 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:

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:

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