stable

auth-landscape

Reference map of authentication, unlock, and sealing-key methods — every common auth primitive scored and matched to its on-* or at-* package.

Reference map of authentication, unlock, and sealing-key primitives.

Statusreference — this page documents no API of its own; the packages it names are documented in the on-* family catalog.
Clustercollaboration-and-auth
Cross-cutsevery @noy-db/on-* package, @noy-db/hub core (KEK derivation, keyring layout, policy gates), and the @noy-db/at-* sealing-provider family.
Companionsession-tiers — how the primitives below compose into a session lifecycle.

What this page is

noy-db is a zero-knowledge document store: every record is encrypted on the user's device before it reaches any storage backend. The whole key hierarchy hangs off one root — a key-encryption key (KEK) derived from a user credential, which wraps the per-collection data-encryption keys (DEKs) (see Core 02 — Enclave). "Login" therefore always means one concrete thing here: producing the material that unlocks the KEK.

This page maps the authentication, unlock, and sealing-key methods in common use, scores each on the dimensions that matter for a zero-knowledge offline-first vault, and names the @noy-db/* package that covers it — or states plainly that it is deliberately omitted, not covered, or out of scope. The next time someone asks "can we log in with Cognito / Active Directory / Windows / Touch ID / BankID?", the answer is one table lookup.

Three distinct functions get conflated as "auth"

FunctionWhat it doesnoy-db family
AuthenticatorProves the user knows / has / is something. Produces a cryptographic proof or releases a wrap key.on-* (sections 1–5)
Identity provider (IdP)Federates identity. Issues tokens. Does not by itself produce wrap-key material.on-oidc bridges (section 6)
Sealing-key storeProtects a machine-generated secret under OS-account or KMS guarantees. Does not authenticate the user.at-* — implementations of the NoydbSealer interface exported by @noy-db/hub (sections 8–9)

Conflating these is the single most common source of misdesign in this space. A Windows DPAPI sealing provider is not an authenticator. A hypothetical on-google would not be different from on-oidc.

Session tiers, briefly

Several rows below refer to noy-db's session tiers — the three-rung privilege ladder that structures unlock (defined in full on session-tiers):

TierRolePrimitive
1Master secret — the root secret; derives the KEK. Factory-fixed inside @noy-db/hub; there is no on-secret package.hub core
2Routine login — multi-slot authenticators, any one of which unlocks the same KEK.on-webauthn, on-oidc, on-password
3Quick-resume after idle — re-opens an already-unlocked session within a bounded idle window.on-pin

Dimensions

DimensionWhat it tests
Online?Network required at unlock time. TOTP needs network only at enrollment, so it scores ❌ here.
Personal deviceSuits a phone/laptop bound to one user.
Shared deviceSuits a kiosk / clinic terminal / shared family iPad. Implicitly tests credential portability — methods that work well on shared hardware are ones where the credential travels with the user.
FactorK = knowledge · D = possession/device · B = biometric/inherence. Multi-factor methods list all that apply.
noy-db matchExisting on-* package, at-* sealing provider, deliberately omitted (with reason), or not covered.

Legend: ✅ good fit · ⚠️ works with caveats · ❌ poor fit / breaks model


1. Knowledge factors

MethodOnline?PersonalSharedFactornoy-db match
Master secret (Diceware)❌✅⚠️ shoulder-surfKtier 1, internal to hub (no on-* package)
Password (tier 2)❌✅⚠️Kon-password
Numeric PIN (4–6 digits)❌✅❌ low entropyKon-pin (tier 3 only)
Pattern lock (Android-style)❌⚠️❌K weak❌ deliberately omitted
Security questionsvaries⚠️❌K weak❌ deliberately omitted (social-engineerable, low entropy)
MethodOnline?PersonalSharedFactornoy-db match
TOTP (Google Auth, Authy, 1Password)❌ post-enrol✅✅ phone-borneDon-totp
HOTP (RFC 4226)❌✅✅D❌ (TOTP supersedes)
Email OTP✅✅✅D (mailbox)on-email-otp
SMS OTP✅✅⚠️ SIM-swapD weakened❌ deliberately omitted (NIST SP 800-63B deprecates)
Magic link✅✅⚠️D (mailbox)on-magic-link
Push notification (Duo, Okta Verify, MS Authenticator number-match)✅✅✅ goes to personal phoneD❌ (vendor; reachable via on-oidc)
WhatsApp / Telegram / Signal OTP✅✅⚠️D❌

3. Possession — hardware

MethodOnline?PersonalSharedFactornoy-db match
FIDO2 / WebAuthn — roaming (YubiKey, SoloKeys, Titan)❌✅✅ bring the keyD (+ B if biometric key)on-webauthn
FIDO2 / WebAuthn — platform (Hello, Touch/Face ID, Android)❌✅❌ device-boundD + Bon-webauthn
Passkey — synced (iCloud Keychain, Google Password Manager, 1Password)✅ at sync✅⚠️ via QR cross-deviceD (synced)on-webauthn (hybrid transport)
Smart cards — PIV / CAC / e-Residency❌✅✅ bring the cardD + K (card PIN)❌ not covered
Hardware OTP tokens (RSA SecurID, classic Yubikey OTP)❌✅✅D❌ (legacy; FIDO2 covers)
Bluetooth proximity (Apple Watch unlock, Pixel Smart Lock)❌✅❌ wearable-boundD❌
Recovery codes (printable)❌✅ paper safe⚠️ emergency onlyDon-recovery
NFC / contactless ID cards (eID, MyKad, Aadhaar w/ NFC)❌✅✅D + K (PIN)❌

4. Inherence — biometrics

Biometrics never are the secret — they gate access to a local credential. So the noy-db match is always indirect.

MethodOnline?PersonalSharedFactornoy-db match
Touch ID / Face ID (Apple)❌✅❌B (gates passkey/keychain)on-webauthn (platform); sealing via at-macos-keychain
Windows Hello (PIN/fingerprint/face/iris)❌✅❌B + Kon-webauthn (platform)
Android Biometric (BiometricPrompt)❌✅❌Bon-webauthn (platform)
Voice biometrics (banking IVR)✅✅⚠️ replay-attackableB weak❌
Iris / vein / palm (industrial / clinical)❌✅✅ if scanner sharedB❌

5. Threshold / split secrets

A recovery profile is an enrolled way back into the vault when the secret is lost (full lifecycle on session-tiers). Four profiles exist in the recovery API: paper (printed single-use codes), shamir (K-of-N shares held by trustees), multi-channel 2-of-3 (email OTP + device PIN + paper code; any two suffice), and admin-mediated (an admin issues a magic-link grant and the user adds one factor). Paper and Shamir are available today; multi-channel and admin-mediated declare their API surface and throw RecoveryProfileNotImplementedError when used.

MethodOnline?PersonalSharedFactornoy-db match
Shamir Secret Sharing (K-of-N)❌⚠️ coordination⚠️D × Non-shamir
Multi-channel 2-of-3 (the multi-channel recovery profile)partial✅⚠️K + D mixcomposed: on-recovery + on-email-otp + on-pin (profile not yet implemented)
Admin-mediated magic-link grant (the admin-mediated recovery profile)✅✅✅D + adminon-magic-link + the hub's magic-link grant flow
MPC / threshold signing (Fireblocks, Web3Auth tssLib)✅⚠️⚠️D × parties❌

6. OIDC / federated identity providers

All require online at auth time. All map to on-oidc with different issuer URLs. Differences are ecosystem fit and built-in 2FA strength, not protocol.

Server-side dependency — OIDC is the only on-* family that requires consumer-operated infrastructure. @noy-db/on-oidc uses a split-key model: the KEK is XOR-split into a deviceHalf (a per-device secret that never leaves the device) and a serverHalf held by a small HTTP service — a key connector — that verifies ID tokens against the issuer's JWKS and stores each user's serverHalf indexed by the token's sub claim. The package implements the client side and documents the two-endpoint server contract (PUT /kek-fragment, GET /kek-fragment); it deliberately does not ship a reference server, hosted instance, or deploy template. If you have no off-device infrastructure, prefer @noy-db/on-webauthn (platform passkey via Touch ID / Face ID / Windows Hello) — the same "Login with X" UX without a server, because the platform passkey is the device-bound credential.

ProviderPersonalSharedDefault factorsNotes / caveatnoy-db match
Google Sign-In✅⚠️ leaves sessionK + optional D (Google Prompt / TOTP / key)Consumer + Workspaceon-oidc
Apple Sign-In✅❌ Apple-boundK + B (device) + DAnonymizes emailon-oidc
Microsoft / Entra ID✅✅ enterpriseK + D (Authenticator)Conditional Accesson-oidc
AD FS (modern)✅✅K + DOIDC since Server 2016on-oidc
GitHub✅⚠️K + D (TOTP/passkey)Dev-tooling authon-oidc
GitLab✅⚠️K + Don-oidc
Okta✅✅ enterpriseK + D (Okta Verify push)Workforce IdPon-oidc
Auth0✅✅tenant-configurableB2C / B2B SaaS IdPon-oidc
AWS Cognito✅⚠️K + optional TOTP/SMSState-machine wrapper is real value but the wrap key still needs split-key shapeon-oidc
Firebase Auth✅⚠️K + DMobile-firston-oidc
Keycloak (self-host)✅✅configurableOn-prem IdPon-oidc
ForgeRock / PingOne✅✅ enterpriseconfigurableLegacy enterprise IAMon-oidc
Facebook / Meta✅❌K + optional DConsumer; not for vaulton-oidc (not recommended)
LinkedIn / X / Discord / Slack / Notion / Atlassian✅⚠️K + DWork-app + consumeron-oidc
LINE / Kakao / WeChat / Naver✅⚠️K + D (varies)Asia-regionalon-oidc
Authentik / Zitadel / Logto✅✅configurableOpen-source Auth0/Oktaon-oidc
Clerk / Stytch / WorkOS / Frontegg✅✅variesDevX-IdP-as-SDKon-oidc
ID.me / Login.gov / GOV.UK Verify✅✅K + D + identity proofingGovernment IdPon-oidc

7. Enterprise / directory protocols

MethodOnline?PersonalSharedFactornoy-db match
LDAP simple/SASL bind (incl AD)✅ to DC⚠️✅ on-premK❌ not covered (would need the split-key shape, like on-oidc)
Kerberos / IWA / SPNEGO✅ KDC then cached⚠️✅K → D (TGT)❌
SAML 2.0✅✅✅varies by IdP❌ — bridge the IdP to OIDC and use on-oidc
RADIUS✅⚠️✅K❌
SSH cert auth (CA-signed)❌✅✅ bring keyD❌
mTLS client certs❌✅⚠️ cert provisioningD❌

8. OS keychain / device-local sealing — NOT authenticators

These don't authenticate the user — they protect the vault's root secret under OS-account guarantees. They map to the at-* family: implementations of the NoydbSealer interface that @noy-db/hub exports for managed-secret mode — the vault mode where the secret is machine-generated, sealed by the provider, and never shown to the user (see session-tiers). One caveat is structural: unlike every other satellite family, an at-* host can decrypt the vault it unseals — that is the point, and the safeguard is scoping the host to a dedicated vault (the trust boundary is spelled out on the at-* overview).

StoreOnline?PersonalSharedFactornoy-db match
Windows DPAPI / Credential Manager❌✅❌ user-boundD (OS account)❌ not covered
macOS Keychain Services❌✅❌Dat-macos-keychain
iOS Keychain (Secure Enclave)❌✅❌D + B❌ not covered
Android Keystore / StrongBox / TEE❌✅❌D + B❌ not covered
Linux Secret Service (libsecret, gnome-keyring, KWallet)❌✅❌D❌ not covered
TPM 2.0 (sealed-to-PCR / no-export)❌✅✅ serverD❌ not covered
Apple Secure Enclave❌✅❌D + Bindirectly via on-webauthn / at-macos-keychain
Browser CredentialStore / navigator.credentials❌✅❌Dindirectly via WebAuthn

9. Cloud / centralized KMS & HSM — server-context sealing

Same family as section 8 (sealing, not auth) but server-side: at-* sealing providers for managed-secret mode in server contexts — a host you control opens a scoped vault to compute on a user's behalf.

ServiceOnline?PersonalSharedFactornoy-db match
Host environment variable (base64 256-bit key, NOYDB_SEALING_KEY by default)❌⚠️✅ serverD (host env)at-env
AWS KMS✅⚠️✅ serverD (IAM)at-aws-kms
GCP Cloud KMS / Cloud HSM✅⚠️✅Dat-gcp-kms
Azure Key Vault / Managed HSM✅⚠️✅Dat-azure-keyvault
HashiCorp Vault Transit✅⚠️✅D (token)❌ not covered
Cloudflare Keyless SSL / Turnstile✅⚠️✅D❌
PKCS 11 HSM (Thales, YubiHSM, SoftHSMv2)❌⚠️✅D❌ not covered
AWS Nitro Enclaves / GCP Confidential Space / Azure Confidential✅⚠️✅D + attestation❌

10. Password managers / personal vaults

Out of scope for on-* — users compose them upstream by storing their secret there. Listed for completeness; not a wrap-key target.

ToolOnline?PersonalSharedFactornoy-db match
1Password⚠️ sync✅❌K + D + B❌
Bitwarden / Vaultwarden⚠️ sync✅⚠️ self-host kioskK + D + B❌
Dashlane / LastPass / NordPass / Proton Pass⚠️ sync✅❌K + D + B❌
Apple Passwords / Google Password Manager⚠️ sync✅❌K/B (device)indirectly via Keychain
KeePass / KeePassXC (offline)❌✅⚠️ portableK + D (key file)❌

11. Threat / context layers (modify, don't replace, the above)

Mechanismnoy-db match
Lockout / duress code / honeypot vaulton-threat
Risk-based / adaptive auth (Okta Risk, Auth0 Anomaly, Cloudflare Turnstile)❌ (provider-side; layer above on-oidc)
Device attestation (Play Integrity, App Attest, ASWebAuthSession)❌
Behavioral biometrics (typing cadence, mouse)❌
Geofencing / IP allowlists❌ (policy-layer, not auth-layer)

12. Emerging / specialized

MethodOnline?PersonalSharedFactornoy-db match
Passkeys cross-device (BLE hybrid transport, FIDO CTAP 2.2)partial✅✅ via QR + phoneD + Bon-webauthn
Decentralized Identifiers — DID/VC (W3C), did:key, did:web, did:ionvaries✅✅D❌
mDL (ISO/IEC 18013-5 mobile driver license)❌ BLE✅✅D + B❌
EUDI Wallet (EU Digital Identity, eIDAS 2)varies✅✅D + B + K❌
BankID (SE/NO/DK/FI) / ItsMe (BE)✅✅✅ phone-borneD + K + B❌ not covered
Web3 wallet (SIWE — Sign-In with Ethereum / Solana)✅✅⚠️D (priv key) + K (wallet PIN)❌
WebOTP API (browser-mediated SMS auto-fill)✅✅⚠️D❌

What's covered today

  • Coverage is strong on offline-first primitives (TOTP, WebAuthn, recovery codes, Shamir, PIN, password) — the parts where zero-knowledge actually buys you something. That is deliberate.
  • Coverage is uniform on OIDC. One on-oidc package handles every provider in section 6, because the protocol — not the brand — is the unit of abstraction. There is no on-cognito, on-okta, or on-google, and none is needed: they are issuer URLs in an on-oidc config.
  • Sealing coverage is host-first. The at-* family ships providers for the host environment (at-env), macOS Keychain (at-macos-keychain), and the three major cloud KMSes (at-aws-kms, at-gcp-kms, at-azure-keyvault). There is no provider for Windows DPAPI, the iOS/Android keystores, Linux Secret Service, or HashiCorp Vault.
  • Not covered today: on-prem directory bind (LDAP / Kerberos), smart cards (roaming WebAuthn covers most of that ground), standalone push-notification factors (reachable via on-oidc), and regional ID schemes (BankID, EUDI Wallet).
  • Deliberately omitted: SMS OTP, security questions, pattern locks — each breaks the security model in a way stated in its table row.
  • on-threat is structurally unique. It is the only on-* package that doesn't authenticate; it modifies how the others authenticate (lockout, duress, honeypot).

Why the hub and the on-* packages are separate

When you enroll recovery codes you install @noy-db/on-recovery and call db.team.enrollRecovery(...) on the hub — and the same two-package shape recurs for passwords and PINs. The split is deliberate: the hub owns the cryptosystem; the on-* package owns the user-facing credential format.

The shared "wrap a DEK set under a credential-derived key" primitive — mintWrappedDeksBlob / unwrapDeksFromBlob, exported from @noy-db/hub — derives an AES-GCM key from the credential string via PBKDF2-SHA256 (600,000 iterations) and encrypts the serialized DEK set. It is the same primitive whether the credential is a printed recovery code or a typed password. What differs is what counts as a well-formed credential: a Base32-with-checksum string (on-recovery), a validated password (on-password). (@noy-db/on-pin follows the same pattern but at 100,000 PBKDF2 iterations — a PIN slot's protection window is short and idle-timeout-bounded, and its wire format is deliberately incompatible with the 600K one.)

ConcernLives inWhy
Cryptosystem (PBKDF2-SHA256 600K → AES-GCM wrap of the DEK set)@noy-db/hub (mintWrappedDeksBlob / unwrapDeksFromBlob)One audited implementation. Every package calls it. A bug-fix or security review touches one place.
On-disk format (PaperRecoveryEntry, KeyringFile.authenticators[], _meta/recovery-paper)@noy-db/hubThe hub knows how to read every keyring it ever wrote; the on-* packages can come and go without changing the format.
Orchestration (db.enrollRecovery, db.recoverSecret, db.enrollAuthenticator, db.unlockViaAuthenticator)@noy-db/hubThese compose multiple primitives and run policy gates. They don't change per credential family.
User-facing string format (Base32 alphabet + checksum, password validation rules, PIN length policy)The on-* packageEach consumer can swap. An app that needs BIP-39 word lists instead of Base32 can supply its own format without touching the hub.
Auto-rotation, burn-on-use, atomicity@noy-db/hubThese are properties of the primitive, not the format.

The classification rule behind the table: does the thing produce wrap-key material directly, or does it just shape user input?

  • Produces wrap-key material directly (secret → PBKDF2 → KEK; KEK → AES-KW → DEKs; the wrap-DEKs primitive itself) → hub. There is one cryptosystem, and there is one of it.
  • Shapes user input (Base32 codes with checksums, password length policies, 4-digit PINs, WebAuthn ceremonies, OIDC token flows) → an on-* package. There are many possible shapes; each consumer picks one.

This is also why @noy-db/on-recovery stays a separate small package rather than a hub subpath: keeping the format outside the hub is what lets you swap Base32 for another code format without forking the cryptosystem.

Classifying a method that isn't in the tables

Evaluating an authentication method this map doesn't list? Walk the same checklist the map itself was built with:

  1. Is it an authenticator, an IdP, or a sealing-key store? Mis-classification means the wrong package family — and the wrong threat model. See "Three distinct functions" above.
  2. Does the protocol already have a generic package? A vendor-flavored OIDC provider is an on-oidc config, not a missing package. A vendor-flavored OS keychain is a sealing concern (at-*), not an authenticator.
  3. Can it carry wrap-key material on its own? If not (LDAP bind, Kerberos tickets, Cognito tokens), the only honest shape is split-key — the same pattern as on-oidc — or gate-only composition with a real authenticator.
  4. Does it work on shared devices? If only on personal devices, treat that as a hard constraint in your deployment. Tier 3 (on-pin) is never safe on shared workstations regardless.

Common questions this map answers

QuestionWhere to lookOne-line answer
"Login with Google?"§6on-oidc with Google issuer.
"Login with Apple?"§6on-oidc with Apple issuer. Apple-ecosystem only on personal device.
"Login with Microsoft / work account?"§6on-oidc with Entra ID issuer.
"Login with AWS Cognito?"§6on-oidc with the Cognito hosted-UI issuer; state-machine sugar can live as a small helper inside the consumer app.
"Login with Active Directory?"§6, §7Modern AD FS or Entra → on-oidc. Raw on-prem AD (LDAP/Kerberos) → not covered; it would need the split-key shape.
"Login with Windows / Windows Hello?"§3, §4, §8Windows Hello is WebAuthn → on-webauthn. "Use my Windows account to unlock" (DPAPI sealing) → not covered; no at-* provider for Windows exists.
"Login with Touch ID / Face ID?"§4Platform passkey via on-webauthn.
"Login with my YubiKey?"§3Roaming WebAuthn via on-webauthn.
"SMS as a 2FA factor?"§2Deliberately omitted. SIM-swap and SS7 attacks make it unfit for vault auth. Use on-totp or on-email-otp.
"BankID / EUDI Wallet?"§12Not covered today.
"Decentralized identity (DID/VC, SIWE)?"§12Not covered today.

See also