
Una herramienta de cifrado simple, moderna y segura (y biblioteca Go) con claves explícitas pequeñas, sin opciones de configuración y componibilidad al estilo UNIX.
age es una herramienta de cifrado de archivos simple, moderna y segura, un formato y una biblioteca Go.
Incluye claves explícitas pequeñas, soporte post-cuántico, sin opciones de configuración y composibilidad al estilo UNIX.
$ age-keygen -o key.txt
Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
$ tar cvz ~/data | age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p > data.tar.gz.age
$ age --decrypt -i key.txt data.tar.gz.age > data.tar.gz
📜 La especificación del formato está en age-encryption.org/v1. age fue diseñado por @benjojo y @FiloSottile.
🦀 Una implementación alternativa interoperable en Rust está disponible en github.com/str4d/rage.
🌍 Typage es una implementación en TypeScript. Funciona en el navegador, Node.js, Deno y Bun.
🔑 Los tokens PIV de hardware como YubiKeys son compatibles a través del plugin age-plugin-yubikey.
✨ Para más plugins, implementaciones, herramientas e integraciones, consulta la lista awesome age.
💬 El autor lo pronuncia [aɡe̞] con una g fuerte, como GIF, y siempre se escribe en minúsculas.
En Windows, Linux, macOS y FreeBSD puedes usar los binarios precompilados.
https://dl.filippo.io/age/latest?for=linux/amd64
https://dl.filippo.io/age/v1.3.1?for=darwin/arm64
...
Si descargas los binarios precompilados, puedes verificar sus pruebas Sigsum.
Si tu sistema tiene una versión compatible de Go, puedes compilar desde el código fuente.
go install filippo.io/age/cmd/...@latest
Se agradece la ayuda de nuevos empaquetadores.
Para la documentación completa, lee la página de manual age(1).
Usage:
age [--encrypt] (-r RECIPIENT | -R PATH)... [--armor] [-o OUTPUT] [INPUT]
age [--encrypt] --passphrase [--armor] [-o OUTPUT] [INPUT]
age --decrypt [-i PATH]... [-o OUTPUT] [INPUT]
Options:
-e, --encrypt Encrypt the input to the output. Default if omitted.
-d, --decrypt Decrypt the input to the output.
-o, --output OUTPUT Write the result to the file at path OUTPUT.
-a, --armor Encrypt to a PEM encoded format.
-p, --passphrase Encrypt with a passphrase.
-r, --recipient RECIPIENT Encrypt to the specified RECIPIENT. Can be repeated.
-R, --recipients-file PATH Encrypt to recipients listed at PATH. Can be repeated.
-i, --identity PATH Use the identity file at PATH. Can be repeated.
INPUT defaults to standard input, and OUTPUT defaults to standard output.
If OUTPUT exists, it will be overwritten.
RECIPIENT can be an age public key generated by age-keygen ("age1...")
or an SSH public key ("ssh-ed25519 AAAA...", "ssh-rsa AAAA...").
Recipient files contain one or more recipients, one per line. Empty lines
and lines starting with "#" are ignored as comments. "-" may be used to
read recipients from standard input.
Identity files contain one or more secret keys ("AGE-SECRET-KEY-1..."),
one per line, or an SSH key. Empty lines and lines starting with "#" are
ignored as comments. Passphrase encrypted age files can be used as
identity files. Multiple key files can be provided, and any unused ones
will be ignored. "-" may be used to read identities from standard input.
When --encrypt is specified explicitly, -i can also be used to encrypt to an
identity file symmetrically, instead or in addition to normal recipients.
INPUT por defecto es la entrada estándar, y OUTPUT por defecto es la salida estándar. Si OUTPUT existe, será sobrescrito.
RECIPIENT puede ser una clave pública de age generada por age-keygen ("age1...") o una clave pública SSH ("ssh-ed25519 AAAA...", "ssh-rsa AAAA...").
Los archivos de destinatarios contienen uno o más destinatarios, uno por línea. Las líneas vacías y las que comienzan con "#" se ignoran como comentarios. Se puede usar "-" para leer destinatarios desde la entrada estándar.
Los archivos de identidad contienen una o más claves secretas ("AGE-SECRET-KEY-1..."), una por línea, o una clave SSH. Las líneas vacías y las que comienzan con "#" se ignoran como comentarios. Los archivos age cifrados con frase de contraseña pueden usarse como archivos de identidad. Se pueden proporcionar múltiples archivos de clave, y los no utilizados serán ignorados. Se puede usar "-" para leer identidades desde la entrada estándar.
Cuando se especifica --encrypt explícitamente, -i también se puede usar para cifrar simétricamente hacia un archivo de identidad, en lugar de o además de los destinatarios normales.
Los archivos se pueden cifrar para múltiples destinatarios repitiendo -r/--recipient. Cada destinatario podrá descifrar el archivo.
$ age -o example.jpg.age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p \
-r age1lggyhqrw2nlhcxprm67z43rta597azn8gknawjehu9d9dl0jq3yqqvfafg example.jpg
Múltiples destinatarios también pueden listarse uno por línea en uno o más archivos pasados con la bandera -R/--recipients-file.
$ cat recipients.txt
# Alice
age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
# Bob
age1lggyhqrw2nlhcxprm67z43rta597azn8gknawjehu9d9dl0jq3yqqvfafg
$ age -R recipients.txt example.jpg > example.jpg.age
Si el argumento de -R (o -i) es -, el archivo se lee desde la entrada estándar.
Para generar claves híbridas post-cuánticas, que son seguras contra futuros ataques de computación cuántica, usa la bandera -pq con age-keygen. Esto podría convertirse en el valor predeterminado en el futuro.
Las identidades post-cuánticas comienzan con AGE-SECRET-KEY-PQ-1... y los destinatarios con age1pq1.... Desafortunadamente, los destinatarios tienen ~2000 caracteres de longitud.
$ age-keygen -pq -o key.txt
$ age-keygen -y key.txt > recipient.txt
$ age -R recipient.txt example.jpg > example.jpg.age
$ age -d -i key.txt example.jpg.age > example.jpg
El soporte para claves post-cuánticas está integrado en age v1.3.0 y posteriores. Alternativamente, el binario age-plugin-pq se puede instalar y colocar en $PATH para agregar soporte a cualquier versión e implementación de age que admita plugins. Los destinatarios funcionarán de inmediato, mientras que las identidades deberán convertirse a identidades de plugin con age-plugin-pq -identity.
Los archivos se pueden cifrar con una frase de contraseña usando -p/--passphrase. Por defecto, age generará automáticamente una frase de contraseña segura. Los archivos protegidos por frase de contraseña se detectan automáticamente al descifrar.
$ age -p secrets.txt > secrets.txt.age
Enter passphrase (leave empty to autogenerate a secure one):
Using the autogenerated passphrase "release-response-step-brand-wrap-ankle-pair-unusual-sword-train".
$ age -d secrets.txt.age > secrets.txt
Enter passphrase:
Si un archivo de identidad pasado a -i es un archivo age cifrado con frase de contraseña, se descifrará automáticamente.
$ age-keygen | age -p > key.age
Public key: age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5
Enter passphrase (leave empty to autogenerate a secure one):
Using the autogenerated passphrase "hip-roast-boring-snake-mention-east-wasp-honey-input-actress".
$ age -r age1yhm4gctwfmrpz87tdslm550wrx6m79y9f2hdzt0lndjnehwj0ukqrjpyx5 secrets.txt > secrets.txt.age
$ age -d -i key.age secrets.txt.age > secrets.txt
Enter passphrase for identity file "key.age":
Los archivos de identidad protegidos por frase de contraseña no son necesarios para la mayoría de los casos de uso, donde el acceso al archivo de identidad cifrado implica acceso a todo el sistema. Sin embargo, pueden ser útiles si el archivo de identidad se almacena de forma remota.
Como característica de conveniencia, age también admite el cifrado con claves públicas SSH ssh-rsa y ssh-ed25519, y el descifrado con el archivo de clave privada correspondiente. (No se admite ssh-agent).
$ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age
$ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg
Ten en cuenta que el soporte de claves SSH emplea criptografía más compleja e incrusta una etiqueta de clave pública en el archivo cifrado, lo que permite rastrear los archivos cifrados para una clave pública específica.
Combinando el soporte de claves SSH y -R, puedes cifrar fácilmente un archivo a las claves SSH listadas en un perfil de GitHub.
$ curl https://github.com/benjojo.keys | age -R - example.jpg > example.jpg.age
Ten en cuenta que las personas podrían no proteger las claves SSH a largo plazo, ya que son revocables cuando se usan solo para autenticación, y que las claves SSH almacenadas en YubiKeys no pueden usarse para descifrar archivos.
El comando age-inspect puede mostrar metadatos sobre un archivo cifrado sin descifrarlo, incluyendo los tipos de destinatario, si usa cifrado post-cuántico y el tamaño de la carga útil.
$ age-inspect secrets.age
secrets.age is an age file, version "age-encryption.org/v1".
This file is encrypted to the following recipient types:
- "mlkem768x25519"
This file uses post-quantum encryption.
Size breakdown (assuming it decrypts successfully):
Header 1627 bytes
Encryption overhead 32 bytes
Payload 42 bytes
-------------------
Total 1701 bytes
Para scripting, usa --json para obtener salida legible por máquina.
| Homebrew (macOS o Linux) |
brew install age
|
| MacPorts |
port install age
|
| Windows |
winget install --id FiloSottile.age
|
| Alpine Linux v3.15+ |
apk add age
|
| Arch Linux |
pacman -S age
|
| Debian 12+ (Bookworm) |
apt install age
|
| Debian 11 (Bullseye) |
apt install age/bullseye-backports
(habilita backports para age v1.0.0+)
|
| Fedora 33+ |
dnf install age
|
| Gentoo Linux |
emerge app-crypt/age
|
| Guix System |
guix package -i age
|
| NixOS / Nix |
nix-env -i age
|
| openSUSE Tumbleweed |
zypper install age
|
| Ubuntu 22.04+ |
apt install age
|
| Void Linux |
xbps-install age
|
| FreeBSD |
pkg install age (security/age)
|
| OpenBSD 6.7+ |
pkg_add age (security/age)
|
| Chocolatey (Windows) |
choco install age.portable
|
| Scoop (Windows) |
scoop bucket add extras && scoop install age
|