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.

01

Oppskyting

Administratoren setter opp tenanten

1
Administrator og Alice

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: "••••••••",
  });
2
Administrator og Alice

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] }
);
🔒 register-tenant
Serveren får aldri tenantens nøkkel
3
Administrator og Alice

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);
02

Signal

En ny bruker ber om tilkobling

4
Bob

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...
mdb://join-request/...
Bare offentlige nøkler — trygt å dele hvor som helst
03

Dokking

Administratoren godkjenner tilkoblingsforespørselen

5
Administrator og Alice

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...
🔒 mdb://join-response/...
Formidle delingspassordet gjennom en annen kanal – på telefon eller ansikt til ansikt
04

Omløpsbane

Samarbeidet i sanntid begynner

6
Bob

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);
7
Administrator og Alice

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
Kom i gang Dypdykk i arkitekturen