Hoe het werkt

Van lancering tot omloopbaan

Stap voor stap: een beheerder richt een MindooDB-tenant in, en twee gebruikers wisselen versleutelde gegevens uit en werken samen — zonder dat de server ooit leesbare gegevens ziet.

01

Lancering

De beheerder richt de tenant in

1
Beheerder en Alice

Tenant aanmaken

De beheerder maakt met één aanroep een nieuwe tenant aan. Daarbij worden alle sleutels gegenereerd, de tenant geopend en de eerste gebruiker, Alice, in de directory geregistreerd.

const { tenant, adminUser, appUser, keyBag }
  = await factory.createTenant({
    tenantId: "acme",
    adminName: "cn=admin/o=acme",
    adminPassword: "••••••••",
    userName: "cn=alice/o=acme",
    userPassword: "••••••••",
  });
2
Beheerder en Alice

Publiceren naar de server

De beheerder registreert de tenant op een MindooDB-server. De server slaat alleen versleutelde gegevens en publieke sleutels op.

await tenant.publishToServer(
  "https://sync.acme.com",
  { registerUsers: [appUser] }
);
🔒 register-tenant
De server krijgt nooit de sleutel van de tenant
3
Beheerder en Alice

Document aanmaken & synchroniseren

Alice maakt een todo-document aan en pusht de versleutelde wijzigingen naar de server.

const db = await tenant.openDB("todos");
const doc = await db.createDocument();
await db.changeDoc(doc, (d) => {
  const data = d.getData();
  data.title = "Buy groceries";
  data.done = false;
});

const remote = await tenant.connectToServer(
  "https://sync.acme.com", "todos"
);
await db.pushChangesTo(remote);
02

Signaal

Een nieuwe gebruiker vraagt om toe te treden

4
Bob

Toetredingsverzoek maken

Bob maakt zijn identiteit lokaal aan — zijn privésleutels verlaten zijn apparaat nooit. Hij genereert een toetredingsverzoek dat alleen publieke sleutels bevat.

const bob = await factory.createUserId(
  "cn=bob/o=acme", "••••••••"
);

const joinRequestURI = factory.createJoinRequest(
  bob, { format: "uri" }
);
// → mdb://join-request/eyJ2IjoxLCJ1c2Vy...
mdb://join-request/...
Alleen publieke sleutels — overal veilig te delen
03

Koppeling

De beheerder keurt het toetredingsverzoek goed

5
Beheerder en Alice

Toetredingsverzoek goedkeuren

De beheerder keurt het verzoek van Bob goed. Daarmee wordt Bob in de directory geregistreerd en worden de symmetrische sleutels met een gedeeld wachtwoord versleuteld.

const joinResponseURI =
  await tenant.approveJoinRequest(
    joinRequestURI,
    {
      adminSigningKey: adminUser
        .userSigningKeyPair.privateKey,
      adminPassword: "••••••••",
      sharePassword: "one-time-secret",
      format: "uri",
    }
  );
// → mdb://join-response/eyJ2IjoxLCJ0ZW5h...
🔒 mdb://join-response/...
Geef het gedeelde wachtwoord via een tweede kanaal door: telefonisch of persoonlijk
04

Omloopbaan

Samenwerken in realtime begint

6
Bob

Toetreden, pullen, wijzigen, pushen

Bob treedt toe tot de tenant, haalt de actuele gegevens op, markeert de todo als klaar en pusht de wijziging terug.

const { tenant: bobTenant } =
  await factory.joinTenant(
    joinResponseURI,
    {
      user: bob,
      password: "••••••••",
      sharePassword: "one-time-secret",
    }
  );

const remote = await bobTenant.connectToServer(
  "https://sync.acme.com", "todos"
);
const db = await bobTenant.openDB("todos");
await db.pullChangesFrom(remote);
await db.syncStoreChanges();

const todo = await db.getDocument(todoDocId);
await db.changeDoc(todo, (d) => {
  d.getData().done = true;
});
await db.pushChangesTo(remote);
7
Beheerder en Alice

Wijzigingen ophalen

Alice haalt de laatste wijzigingen op en ziet dat de todo klaar is.

await db.pullChangesFrom(remote);
await db.syncStoreChanges();

const updated = await db.getDocument(todoDocId);
console.log(updated.getData().done);
// → true ✓
Todo is klaar ✓

Wat de server wel en niet ziet

De server ziet

  • Publieke ondertekeningssleutels (Ed25519)
  • Publieke versleutelingssleutels (RSA-OAEP)
  • Versleutelde blobs (AES-256-GCM)
  • Metadata van vermeldingen (tijdstempels, content-hashes)
  • Hashes van gebruikersnamen (SHA-256 — niet de namen zelf)

De server ziet nooit

  • Gebruikersnamen (versleuteld met de RSA-sleutel van de admin)
  • Documentinhoud (end-to-end versleuteld)
  • Privésleutels (blijven op het apparaat)
  • Gedeelde wachtwoorden (alleen out-of-band)
  • Symmetrische versleutelingssleutels
Aan de slag Architectuur in detail