Cifrar archivos en Linux con age: contraseña, claves y recuperación

Enviar un documento por correo o subirlo a una carpeta compartida es sencillo. Lo que no siempre queremos es que el servicio pueda leerlo. Para un archivo puntual, podemos cifrarlo antes de enviarlo y recuperar el contenido después en nuestro ordenador.

age es una herramienta de software libre que permite hacerlo desde la terminal. Podemos utilizar una contraseña o cifrar para una persona que nos haya pasado su clave pública. Vamos a ver ambos casos, pero primero con un documento de prueba que podamos recuperar sin poner en riesgo nada importante.

La parte que más cuidaría no es escribir el primer comando. Es comprobar cómo se abre la copia y conservar lo necesario para hacerlo cuando ya no tengamos el original a mano.

Logotipo oficial de age

Logotipo de age, © Filippo Valsorda, diseñado por Studiovagante. Uso del original conforme a las condiciones del proyecto.

Instalar age en Ubuntu o Linux Mint

En distribuciones actuales basadas en Ubuntu lo encontramos en los repositorios:

sudo apt update
sudo apt install age
age --version
age-keygen --version

La página del proyecto incluye instalación para otras distribuciones y sistemas. No necesitamos ejecutar el cifrado con sudo. Lo hacemos con los permisos de la cuenta que tiene acceso al documento.

La versión del repositorio puede ser distinta de la última publicada. Para los ejemplos básicos necesitamos age y age-keygen. Si vamos a utilizar opciones nuevas, comprobamos que existan en la versión instalada y que la persona que recibirá el archivo pueda abrirlo.

Trabajaremos dentro de una carpeta privada de pruebas, no sobre el único ejemplar de un documento. El nombre informe.txt representa nuestro archivo de ejemplo, que sustituiremos cuando hayamos comprobado el recorrido.

Cifrar un archivo con contraseña

Para una operación ocasional, la opción más directa es:

age -p -o "informe.txt.age" "informe.txt"

El programa solicita la contraseña de forma interactiva. No la añadimos al comando ni a un script que después podamos compartir. Podemos utilizar una frase larga y difícil de adivinar o la generación que ofrece la herramienta, guardándola de forma segura.

El original informe.txt no se elimina. La salida informe.txt.age contiene la copia cifrada. Antes de ejecutar la orden, comprobamos que no exista un archivo de salida que queramos conservar: age -o puede sobrescribirlo.

No basta con poner una contraseña complicada si después la mandamos dentro del mismo mensaje que el archivo. Para compartirla, utilizaría un canal separado y comprobaría a quién se la entrego. También debemos tener en cuenta que quien la conozca puede guardar una copia descifrada.

El cifrado protege el archivo, no controla todo lo que hará el destinatario después de abrirlo.

Recuperar el archivo sin pisar el original

Para comprobar el resultado, utilizamos otro nombre:

age -d -o "informe-recuperado.txt" "informe.txt.age"

age detecta que la copia está protegida con contraseña y la pide. No necesitamos pasar una clave privada para este caso. Si el comando falla, no tratamos una salida parcial como un documento recuperado correctamente.

Cuando los dos archivos son de prueba y no contienen datos privados, podemos comprobar si sus bytes coinciden:

cmp "informe.txt" "informe-recuperado.txt"

Si son iguales, cmp termina correctamente sin mostrar diferencias. Después abrimos la copia con el programa que corresponda y comprobamos su contenido. Para una carpeta de trabajo real, no eliminaría el original hasta tener una recuperación verificada y una copia adecuada.

Tampoco interpretaría un archivo vacío como éxito sólo porque exista en el directorio. Hay que comprobar el código de salida del proceso y qué se ha recuperado.

Utilizar claves cuando otra persona recibirá el documento

Con este método, el destinatario conserva una clave privada y nos entrega su parte pública. Ciframos para esa parte pública sin conocer su secreto.

En el ordenador del destinatario se genera la identidad:

age-keygen -o "identidad-age.txt"
age-keygen -y "identidad-age.txt" > "destinatario-age.txt"

identidad-age.txt contiene el secreto necesario para recuperar archivos. No se envía al emisor. destinatario-age.txt contiene la parte pública que sí puede compartir. La documentación de age-keygen describe la generación y extracción.

Estos comandos utilizan la clave nativa clásica que genera la orden básica. Las versiones recientes también incorporan claves híbridas poscuánticas, pero requieren comprobar compatibilidad. No cambiaría de formato sin saber qué versión utiliza el receptor.

El generador escribe el archivo nuevo con permisos restringidos y se niega a sustituir una identidad existente. No solucionamos ese error borrando la clave anterior. Puede ser la única que permite abrir documentos que ya tenemos guardados.

También conviene guardar la identidad fuera de un repositorio de código. Una carpeta de proyecto que sincronizamos o subimos a Git no se convierte en un lugar adecuado por tener un archivo .gitignore que quizá añadimos después.

Cifrar con la clave pública recibida

En el equipo del emisor, teniendo el documento y el archivo público del destinatario:

age -R "destinatario-age.txt" \
  -o "informe-para-enviar.txt.age" "informe.txt"

-R lee los destinatarios desde un archivo. Es más cómodo que copiar una clave larga dentro del comando y evita errores al moverla entre ventanas. Tenemos que comprobar que el archivo público corresponde a la persona adecuada.

El receptor recupera la copia con su identidad:

age -d -i "identidad-age.txt" \
  -o "informe-recibido.txt" "informe-para-enviar.txt.age"

Podemos probar todo el recorrido en nuestro ordenador con una identidad artificial antes de enviar documentos. Eso permite distinguir un problema de herramienta de un archivo público incorrecto.

Hay un detalle importante: cifrar sólo para otra persona no implica que nosotros podamos descifrar después esa copia. Si queremos conservar ese acceso, debemos incluir también nuestro destinatario público o mantener otra copia recuperable.

Dar acceso a dos destinatarios

Un archivo de destinatarios puede contener una clave pública por línea. Si incluimos la del receptor y la nuestra, ambos podremos abrir la misma copia con nuestra identidad correspondiente.

No hace falta que esas dos personas compartan su clave privada. Cada una utiliza la suya. La documentación de age explica esa diferencia entre destinatarios e identidades.

En la comprobación de esta guía se cifró un documento de prueba para dos claves distintas y se recuperó con ambas. Con una tercera identidad, que no estaba incluida, la operación falló. La recuperación correcta coincidió byte por byte con el original.

Esto no establece permisos separados sobre partes del documento. Cada destinatario incluido puede acceder al archivo completo. Si esa no es nuestra intención, necesitamos separar los contenidos antes de cifrarlos.

Qué protege y qué sigue siendo visible

El contenido cifrado no queda protegido si el propio ordenador está comprometido y alguien puede leerlo antes del cifrado o después de abrirlo. Tampoco se borran las copias previas por utilizar age.

El nombre exterior del archivo, su tamaño y el hecho de que lo compartamos pueden seguir siendo visibles. Un nombre como nominas-octubre.txt.age revela algo incluso sin abrir el documento. Podemos elegir un nombre neutro si esa información importa.

La clave privada necesita su propia protección y copia. Los permisos del archivo limitan acceso entre cuentas del sistema, pero no sustituyen todas las medidas de seguridad del equipo. Si guardamos secreto y datos juntos en una carpeta accesible para otras personas, hemos debilitado el propósito del cifrado.

Además, cifrar no equivale a firmar la identidad del remitente. Poder abrir un archivo correctamente no demuestra por sí solo quién lo creó. Para una comunicación que necesite autenticidad del emisor, hay que diseñar también esa parte.

Cifrado, sincronización y copia de seguridad

age resuelve el cifrado de una copia, no toda una estrategia de respaldo. No lleva por sí solo un calendario de versiones, una política de conservación o una comprobación de que otra unidad siga funcionando.

Podemos enviar el archivo por un servicio, guardarlo en un disco o pasarlo con LocalSend. Eso determina cómo se transporta, no quién puede descifrarlo ni si tendremos una copia cuando se pierda el equipo.

Si sincronizamos la identidad privada con los archivos cifrados, debemos entender qué recibe el servicio. Y si cambiamos de ordenador, conviene comprobar que podremos recuperar los documentos antes de retirar el anterior.

Me quedaría con una prueba sencilla: cifrar un archivo pequeño, recuperarlo con el método elegido y verificar que coincide. Cuando ese recorrido está claro, ya podemos aplicarlo a documentos propios sin descubrir demasiado tarde que nos falta la contraseña o la clave.

Sergio Almela

Senior Software Engineer con más de diez años de experiencia. Escribo sobre Linux, software libre, backend, arquitectura, rendimiento, testing e IA aplicada al desarrollo.

Ver todas las entradas de Sergio Almela →