Slik fungerer det
Fra oppskyting til omløpsbane
Trinn for trinn: en administrator setter opp en MindooDB-tenant, og to brukere utveksler krypterte data og samarbeider — uten at serveren noen gang ser klartekst.
Oppskyting
Administratoren setter opp tenanten
Opprette tenanten
Administratoren oppretter en ny tenant med ett enkelt kall. Det genererer alle nøkler, åpner tenanten og registrerer den første brukeren, Alice, i katalogen.
const { tenant, adminUser, appUser, keyBag }
= await factory.createTenant({
tenantId: "acme",
adminName: "cn=admin/o=acme",
adminPassword: "••••••••",
userName: "cn=alice/o=acme",
userPassword: "••••••••",
}); Publisere til serveren
Administratoren registrerer tenanten på en MindooDB-server. Serveren lagrer bare krypterte data og offentlige nøkler.
await tenant.publishToServer(
"https://sync.acme.com",
{ registerUsers: [appUser] }
); Opprette og synkronisere et dokument
Alice oppretter et todo-dokument og sender de krypterte endringene til serveren.
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); Signal
En ny bruker ber om tilkobling
Lage tilkoblingsforespørsel
Bob oppretter identiteten sin lokalt — de private nøklene hans forlater aldri enheten. Han lager en tilkoblingsforespørsel som bare inneholder offentlige nøkler.
const bob = await factory.createUserId(
"cn=bob/o=acme", "••••••••"
);
const joinRequestURI = factory.createJoinRequest(
bob, { format: "uri" }
);
// → mdb://join-request/eyJ2IjoxLCJ1c2Vy... Dokking
Administratoren godkjenner tilkoblingsforespørselen
Godkjenne tilkoblingsforespørselen
Administratoren godkjenner forespørselen fra Bob. Det registrerer Bob i katalogen og krypterer de symmetriske nøklene med et delingspassord.
const joinResponseURI =
await tenant.approveJoinRequest(
joinRequestURI,
{
adminSigningKey: adminUser
.userSigningKeyPair.privateKey,
adminPassword: "••••••••",
sharePassword: "one-time-secret",
format: "uri",
}
);
// → mdb://join-response/eyJ2IjoxLCJ0ZW5h... Omløpsbane
Samarbeidet i sanntid begynner
Bli med, hente, endre, sende
Bob blir med i tenanten, henter de nyeste dataene, markerer todoen som ferdig og sender endringen tilbake.
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); Hente endringer
Alice henter de nyeste endringene og ser at todoen er ferdig.
await db.pullChangesFrom(remote);
await db.syncStoreChanges();
const updated = await db.getDocument(todoDocId);
console.log(updated.getData().done);
// → true ✓ Todoen er ferdig ✓ Hva serveren ser og ikke ser
Serveren ser
- Offentlige signeringsnøkler (Ed25519)
- Offentlige krypteringsnøkler (RSA-OAEP)
- Krypterte blobber (AES-256-GCM-chiffertekst)
- Metadata om oppføringer (tidsstempler, innholdshasher)
- Hasher av brukernavn (SHA-256 — ikke navnene selv)
Serveren ser aldri
- Brukernavn (kryptert med administratorens RSA-nøkkel)
- Dokumentinnhold (ende-til-ende-kryptert)
- Private nøkler (blir liggende på enheten)
- Delte passord (bare out-of-band)
- Symmetriske krypteringsnøkler