Секреты в гите
30 сентября 2026 г.
Тем, кто запарился возиться с секретами и хочет хранить их шифрованными в гите, ловите pre-commit хук:
#!/usr/bin/env bash
set -euo pipefail
[ -f ~/.secrets-key ] && [ -d secrets ] || exit 0
pack() { tar -c --format=ustar --sort=name --owner=0 --group=0 --numeric-owner --mtime=2000-01-01Z secrets | gzip -n9; }
salt=$(pack | sha256sum | cut -c-16)
{ printf Salted__; xxd -r -p <<<"$salt"; pack | openssl enc -aes-256-cbc -md sha256 -pbkdf2 -iter 200000 -S "$salt" -pass file:$HOME/.secrets-key; } >secrets.tar.enc
git add secrets.tar.encМастер-пароль кладёте в ~/.secrets-key, содержимое папки secrets из рабочей копии будет коммититься в репу как secrets.tar.enc.
Расшифровать:
openssl enc -d -aes-256-cbc -md sha256 -pbkdf2 -iter 200000 -pass file:$HOME/.secrets-key -in secrets.tar.enc | tar -xzf -Обычное шифрование каждый раз меняет результирующий файл и засоряет историю git. Тут фишка в convergent encryption - используем SHA256 контента как соль пароля для шифрования. Если содержимое папки не меняется, то и шифрованный файл не меняется.
Люблю, сука, криптографию.