Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Encrypted vector search

Search your embeddings on a server you don’t fully trust, choosing per collection (vector_encryption) where you sit on the confidentiality/performance spectrum — because no scheme gives fast server-side ranking, zero leakage, and practical performance all at once.

Both modes are opt-in and off by default, and they complement encryption at rest rather than replacing it.

DCPE (vector_encryption: "dcpe", experimental)

The client encrypts vectors with distance-comparison-preserving encryption — the published Scale-And-Perturb scheme, built only from audited RustCrypto primitives — so the server can rank ciphertexts by approximate L2 distance without ever holding the plaintext vectors or the key.

It is not semantically secure: L2-only, and it leaks the approximate distance-comparison relation by design (that is how the server ranks). It carries real, documented caveats and is broken by known-plaintext or strong-prior adversaries. Read the full specification — including the v2 hardening (a key-derived component shuffle and an ordering-preserving global normalisation) and what it can and cannot do — on the DCPE page before using it.

Native ciphers ship in Rust, Python, and TypeScript, validated against each other by a cross-language known-answer test.

Client-side opaque vectors (vector_encryption: "client_side", semantically secure)

The server stores only XChaCha20-Poly1305 ciphertext (the same audited AEAD as at-rest — no new cryptography) plus a zero placeholder, does no distance math, and learns nothing about the vectors — no coordinates, no distances, no geometry (genuinely IND-CPA).

The honest cost: the server doesn’t rank, so the client fetches the (optionally pre-filtered) set and ranks locally — best for small/medium or server-pre-filtered collections. Native VectorCiphers ship in Rust/Python/TypeScript with a bit-exact cross-language test, plus a search-style helper that hides the fetch-and-rank round-trip. Read the client-side opaque vectors page.

Which one?

DCPEClient-side opaque
Server ranks?yes (approximate L2)no (client ranks)
Semantically secure?no (leaks distance ordering)yes (IND-CPA)
MetricL2 onlyany (client-side)
Best forserver-side ANN with a weaker, honest guaranteestrong confidentiality, small/pre-filtered sets

See the cryptography overview for how these fit Quiver’s broader posture, and the threat model for the boundaries.