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.
Lancering
De beheerder richt de tenant in
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: "••••••••",
}); 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] }
); 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); Signaal
Een nieuwe gebruiker vraagt om toe te treden
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... Koppeling
De beheerder keurt het toetredingsverzoek goed
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... Omloopbaan
Samenwerken in realtime begint
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); 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