Home Blog Audit chains

Hash-chained audit logs that survive an air-gap

How we made an audit chain that you can verify after a cold restore on a network you cannot reach.

April 8, 2026 · 7 min read

An audit log is only useful if an auditor can trust it. A CSV a developer could have edited is not evidence. sapctl's answer is a hash-chained, ed25519-signed audit log that verifies entirely offline: no phone-home, no certificate authority, no network dependency.

The chain

Every audit event is a JSONL line. Each line carries the SHA-256 of the previous line, so the whole log forms a chain. The genesis block is 64 zero bytes. Alter any line, and every subsequent hash breaks.

sapctl audit init
sapctl --audit s4 catalog discover --cred sandbox --top 5
sapctl audit verify

audit verify walks the chain, recomputes every hash, and checks the ed25519 signature. It returns a yes/no on whether any record was altered after the fact.

Why offline matters

Regulated SAP shops run in air-gapped networks: a German bank's production, a defense prime's classified enclave. A verification path that needs a network, a CA, or a hosted service is a non-starter. sapctl's chain verifies with local CPU and a public key embedded in the binary.

Air-gap bundles

For the most restricted environments, sapctl packages the evidence into an in-toto v1 bundle: rows, chain, public key, and manifest in one signed archive. The same binary that runs in a connected bank also runs on a USB stick into a classified network.

What this buys you

Tamper-evidence is a property of the data, not the network. A hash chain you can verify on a cold, disconnected host is the only audit log that survives the environments where audits actually matter.

Back to blog