Cryptare v1.4.0 — Now in Production Maintenance
I am proud to announce that Cryptare has reached its production maintenance phase!
Cryptare is a Go terminal tool for encrypting, decrypting, compressing and extracting files and directories. It combines a scriptable command-line interface with an interactive terminal UI and a small local store for password-protected keys. With v1.4.0, the file format, password handling and key store are settled, every high- and medium-severity security finding is closed, and every release is built, signed and published automatically. From here on, the focus shifts from building new features to keeping Cryptare stable, secure and up to date.
It has been seven weeks since v1.0.0 shipped on September 14, with seven releases since then (v1.0.1, v1.1.0, v1.2.0, v1.3.0, v1.3.1, v1.3.2 and v1.4.0). Here is what came together to get here.
What’s new in v1.4.0
- An importable package
- All of Cryptare’s code moved from
internalinto an importablepkgpackage.main.gonow only holds the build version and callspkg.Run - This lets Capsus, my toolbox that bundles every command-line tool I have built into one binary, run Cryptare as one of its commands
- All of Cryptare’s code moved from
- Multi-arch container image
ghcr.io/jabbott-iii/cryptareis now one image forlinux/amd64andlinux/arm64, sodocker pullfetches the right one for your machine- Each platform’s image is also tagged on its own (
1.4.0-amd64,1.4.0-arm64)
v1.4.0 doesn’t change any command, flag or file format, so it is a drop-in upgrade from v1.3.2.
Where Cryptare stands
- Encryption
- AES-256-GCM, streamed in authenticated chunks, so memory use doesn’t grow with file size
- Keys derived from your password with Argon2id (64 MiB of memory, 3 passes, 4 lanes)
- A versioned file format: files, keys and exports from every earlier version still open, with nothing to convert
- Directories encrypt into a single encrypted archive and decrypt back into their original tree
- Key management
- Random keys in a per-user key store, each protected by one master password
- Encrypt with a stored key instead of a password (
encrypt --key);decryptfinds the key from the file’s header - Export keys to back them up or move them, and import them on another machine
- Passwords
- New passwords need at least 15 characters, are hidden at the prompt and are typed twice to confirm
- Unicode NFKC normalisation, so the same password matches however its characters were typed
--password-fileand piped input keep passwords out of your shell history
- Safe by default
- Nothing is overwritten without
--force, outputs are written atomically, and Ctrl+C removes unfinished output - Extraction stops at 10 GiB of output or 100,000 entries by default, to stop decompression bombs
- On Linux and macOS, everything Cryptare writes is private to you
- Nothing is overwritten without
- Compression
- gzip, tar.gz and zip, with optional compression levels and automatic output names
Production hardening
- Security
- 21 security findings recorded across four reviews (manual review, probe tests, gosec, golangci-lint, govulncheck, fuzzing and an independent review); every high- and medium-severity finding is closed
- Fixes include refusing empty passwords, a password prompt that no longer cuts off at the first space, a key derivation cost that meets current guidance, bounded and symlink-safe extraction, and no partial plaintext left behind after an interrupted operation
- Golden files written by earlier versions are part of the test suite, so every build must keep opening them
- CodeQL, gosec and govulncheck run on every change and weekly
- Testing
- CI runs
go vet, golangci-lint and the full test suite on Linux, macOS and Windows
- CI runs
- Release & Supply Chain
- Native binaries for Linux (x86-64 and ARM64), macOS (Intel and Apple silicon) and Windows (x86-64)
- Linux binaries are statically linked against musl, so they run on any distribution
- Every release file and the container image carry
checksums.txtand a signed SLSA build provenance attestation LICENSE,NOTICEandTHIRD_PARTY_LICENSES.txtship in every archive- The container image runs as an unprivileged user (UID 10001) from base images pinned by digest
- Dependabot proposes Go module, GitHub Actions and Docker updates
Upgrading
From v1.3.2, replace the binary or pull the new image; nothing else changes.
From older versions, two changes matter most:
- Since v1.3.0, the key store lives in your user data folder instead of
cryptare.dbin the current folder.cryptare keys pathprints where it is, and Cryptare tells you when it finds an oldcryptare.dbnext to you. - Since v1.3.2, a key has one master password everywhere, and
keys exportprotects the export with it.
Versions up to v1.1.0 can’t read the versioned format, so upgrade every machine that needs to decrypt new files. The README’s upgrade notes cover every release.
To verify a download before you run it:
gh attestation verify cryptare_linux_amd64.tar.gz --repo jabbott-iii/Cryptare
gh attestation verify oci://ghcr.io/jabbott-iii/cryptare:1.4.0 --repo jabbott-iii/Cryptare
Roadmap
Cryptare is now in production maintenance. Going forward:
- Security fixes ship as patch releases of the supported 1.4.x line
- Dependencies and the Go toolchain are kept current.
mainalready builds with Go 1.26.9, which fixes a Go standard library flaw inos.Rooton Windows (GO-2026-6604), and it ships in the next patch release - Stability comes first; new features are not the focus
Found a vulnerability? Please report it privately through the repository’s Security tab, as described in SECURITY.md.
Thank you for following along!