TGViewer
Библиотека Go-разработчика | Golang Библиотека Go-разработчика | Golang @goproglib · 24.1K subscribers
Post #7403 3.07K
🔒 age, шифрование файлов без конфигов и без GPG

Надо зашифровать бэкап, дамп базы или файл с секретами. Классический ответ это GPG, а вместе с ним keyring, сеть доверия, десяток флагов и вывод, который не прочитать без документации. Для одной операции это перебор.

age делает ровно эту задачу и ничего больше. Инструмент шифрования файлов, формат и Go библиотека от Филиппо Вальсорды. Маленькие явные ключи, никаких опций конфигурации, поведение в духе UNIX. Формат описан спецификацией age-encryption.org/v1.

Базовый сценарий

Три команды:
$ age-keygen -o key.txt
Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p

$ tar cvz ~/data | age -r age1ql3z7... > data.tar.gz.age

$ age -d -i key.txt data.tar.gz.age > data.tar.gz


Публичный ключ это одна строка с префиксом age1, приватный одна строка с префиксом AGE-SECRET-KEY-1. Никакого keyring и никакого состояния на диске кроме файла с ключом.

Что ещё умеет

Флаг -r можно повторять, тогда файл расшифрует любой из получателей. Список получателей удобнее держать файлом и передавать через -R. Флаг -p шифрует паролем, причём при пустом вводе age сгенерирует стойкую фразу сам. Флаг -a даёт текстовый PEM вывод, если файл надо вставить в письмо или в YAML. При расшифровке тип файла определяется автоматически.

Приятно, что можно шифровать на обычные SSH ключи:
$ age -R ~/.ssh/id_ed25519.pub example.jpg > example.jpg.age
$ age -d -i ~/.ssh/id_ed25519 example.jpg.age > example.jpg


Отсюда трюк с GitHub, где публичные ключи лежат по адресу вида github.com/username.keys:
$ curl https://github.com/benjojo.keys | age -R - example.jpg > example.jpg.age


С версии 1.3.0 есть гибридные постквантовые ключи через age-keygen -pq. Цена в том, что публичный ключ получателя разрастается примерно до двух тысяч символов.

Как библиотека

CLI это обёртка над пакетом filippo.io/age:
recipient, _ := age.ParseX25519Recipient(pubKey)

out := &bytes.Buffer{}
w, err := age.Encrypt(out, recipient)
if err != nil {
log.Fatal(err)
}
io.WriteString(w, "секретные данные")
w.Close() // обязателен, иначе не запишется финальный блок


Всё построено на io.Reader и io.Writer, поэтому поток по сети шифруется так же, как строка в памяти. Расшифровка через age.Decrypt с age.ParseX25519Identity.

Ставится из репозиториев почти везде, либо командой go install filippo.io/age/cmd/...@latest.

age стоит брать, когда нужно зашифровать файл и не хочется тащить модель доверия GPG. Подписей, отзыва ключей и сети доверия здесь нет и не будет. Это не замена GPG во всём, а замена в той задаче, ради которой его чаще всего и запускают.

➡️ Репозиторий

📍 Навигация: Вакансии • Задачи • Собесы

🐸 Библиотека Go-разработчика

#GoToProduction
  • ❤ 9
  • 👍 2
More from @goproglib
  1. Sep 23, 2026💥 TCP/IP: что происходит с данными в сети Когда Go-приложение отправляет данные по сети,…
  2. Sep 22, 2026🔴 Встроенные функции len, make, panic — встроенные функции Go, которые можно использовать…
  3. Sep 21, 2026🤩 Go с нуля: серия базовых шпаргалок Собрали путь от Hello, World! до goroutines, channel…
  4. Sep 20, 2026🤔 Вопрос с собеседования по Go Что выведет программа? ❤️ — [1 2 3 4 5] / [1 2 10] 🔥 — [1…
  5. Sep 19, 2026🛠 Rune — open-source IDE и terminal multiplexer на Go Rune объединяет IDE, терминал и AI-…
  6. Sep 18, 2026🤩 SQLite вместо отдельного брокера в Go Watermill поддерживает SQLite Pub/Sub — сообщения…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →