Skip to content

0050 — Hourly signed digest chain and an auditor-run verify command

Status: superseded by 0061 Date: 2026-09-17

Context

Object Lock proves nothing was deleted. It does not prove nothing was omitted or that an object was written when claimed. Frameworks expect hash chains, signatures or time-stamps, and auditors ask three questions: was it changed, when was it written, and can you prove it without trusting the writer. The cloud provider's own trail uses hourly digest files with a signature chain and a validation command; transparency logs (Merkle trees with inclusion and consistency proofs) are the stronger model but a real service to run (see the storage survey in this repository's history).

Decision

A digest job runs hourly per profile prefix. It lists the hour's objects, records each object's SHA-256, names the previous digest and the previous digest's signature, signs the digest with an asymmetric key from a pluggable Signer (KMS or a secret manager's transit engine), and writes it under a separate digest prefix with the same Object Lock retention. Digests are written for empty hours too, so absence is provable.

A verify command walks the chain newest-first over a time range, checks each digest's signature against the published public key, each object's hash, and each object's Object Lock retention, and prints per-object and per-digest results and a summary. Auditors run it themselves against read-only credentials. A nightly run marks verified windows so the viewer can show an integrity badge, and a failure emits audit.digest.failed with block delivery.

What the chain proves depends on who holds the signing key. With a key the writer holds itself, the chain proves that objects have not changed since they were signed, by a party who could also have chosen what to sign. That is enough for a test and for a small deployment that accepts it, and it is what the local signer is for. A managed key, in KMS or a secret manager's transit engine, never leaves its provider, so the archive's writer cannot sign at will and the chain proves what an auditor wants it to: the operator did not choose what to sign. A deployment that must answer an assessor uses a managed key, and the verifier is the same either way.

Time-stamp anchoring of the chain head with an RFC 3161 or ETSI time-stamp is a framework profile option, required by none of the shipped framework profiles and recommended by the evidence framework profile.

Consequences

  • The digest job is independent of the number of writers.
  • Moving objects breaks verification by design; the S3 guide says so.
  • A public transparency log or Merkle proofs remain an upgrade path if a customer contract asks for third-party witnessing.

Alternatives considered

  • Hash-chained rows in a database. Detects edits but lives in a mutable store and needs the same external anchor.
  • A transparency log. Strongest, but a service with its own storage and witnesses; not justified at this scale.
  • Signing every record. Expensive and still needs a chain to prove omission.