Alle dokumenter

Kryptering og nøkler

Oppdatert: 28. september 2026

Retningslinjen sier hva som er kryptert, hva som er hashet, hvor nøklene ligger, og hvem som har dem. Den skiller mellom kryptering Verid gjør selv og kryptering leverandørene gjør. Det som ikke er på plass, står nederst.

Sist oppdatert: 28.09.2026.


1. Kryptering under overføring

  • Nettleser til Verid: HTTPS, levert av Vercel. Strict-Transport-Security: max-age=63072000 ber nettleseren bruke bare HTTPS i to år (apps/web/next.config.ts, og Vercel setter også hodet). Uten includeSubDomains og preload, med vilje. Informasjonskapselen for sesjonen er Secure i produksjon (useSecureCookies i packages/auth/src/auth.ts).
  • Verid til databasen: TLS til Neon.
  • Verid til kildene og underleverandørene: HTTPS. Alle adresser i packages/sources/src/ er https:// (unntatt XML-navnerom, som ikke er adresser det kobles til).

2. Kryptering på disk

Verid krypterer ikke data selv på disk. Det gjør leverandørene:

DataHvorKryptering
DatabasenNeonKryptert på disk hos Neon
Rapportarkivet (PDF/A)Vercel BlobKryptert på disk hos Vercel. Privat tilgang: en fil kan ikke hentes uten nøkkel (access: "private" i apps/web/lib/kjoring/arkiv.ts)
E-postResendEtter Resends egne tiltak

Nøklene til denne krypteringen styres av leverandøren. Verid har ikke egne nøkler for den.

3. Hashing

Hash brukes der Verid må kunne kjenne igjen en verdi uten å lagre den, eller bevise at noe ikke er endret.

HvaHvordanHvor
Lenken til kundeerklæringen24 tilfeldige byte (192 bit). Bare SHA-256 av lenken lagres (kundeerklaering.token_hash)apps/web/lib/kundeerklaering-server.ts
Rolleindeksen`sha256(normalisert navn + "" + fødselsdato)`packages/db/src/nokkel.ts
Bevisgrunnlaget i en rapportSHA-256 av en kanonisk form av søkene (rapport.bevis_sha256)packages/pipeline/src/bevis.ts
Den arkiverte PDF-enSHA-256 av filen (rapport.pdf_sha256)packages/report/src/frys.ts

Merk om rolleindeksen: navn og fødselsdato har lite tilfeldighet. Hashen er en indeksnøkkel, ikke et skjul. Den som kjenner navnet og datoen, kan regne den ut. Tabellen kan bare leses fra serveren.

Passord lagres som hash av Better Auth. Verid ser aldri passordet.

4. Hemmeligheter

Alle hemmeligheter ligger som miljøvariabler hos Vercel. Ingen ligger i repoet (.gitignore utelater .env* og *.pem). Navnene står i .env.example.

HemmelighetHva den gjørHva som skjer ved bytte
BETTER_AUTH_SECRETSignerer informasjonskapslene for sesjonenAlle brukere logges ut (.env.example)
DATABASE_URL, DATABASE_URL_UNPOOLEDFull tilgang til databasenBytt passord i Neon, oppdater Vercel, rull ut
BLOB_READ_WRITE_TOKENLese og skrive rapportarkivetSettes av Vercel når Blob kobles til
CRON_SECRETBeviser at kallet til slettejobben kom fra Vercel. Uten den svarer ruten 503 (apps/web/app/api/cron/slett-utlopte/route.ts)Ingen følger utover neste kjøring
RESEND_API_KEYSende e-postE-post stopper til ny nøkkel er satt
OPENSANCTIONS_API_KEY, SERPER_API_KEYKall til leverandøreneSøket blir «ikke-tilgang» til ny nøkkel er satt
MATRIKKEL_USER, MATRIKKEL_PASSGrunnboken hos KartverketGrunnboken blir et sjekklistepunkt
MASKINPORTEN_PRIVAT_NOKKEL, MFR_PRIVAT_NOKKELSe punkt 5Se punkt 5

Språkmodellen går gjennom Vercel AI Gateway med OIDC. På Vercel settes VERCEL_OIDC_TOKEN automatisk, og det finnes ingen fast nøkkel. AI_GATEWAY_API_KEY er reserven for miljøer uten OIDC (apps/web/lib/kjoring/modell.ts).

5. Maskinporten-nøkkelen

Maskinporten gir tilgang til Register over reelle rettighetshavere, og til Økokrims API for melding om mistenkelig forhold (MFR).

  • Nøkkelen er en privat RSA-nøkkel i JWK-format, lagret i MASKINPORTEN_PRIVAT_NOKKEL. MFR kan ha sin egen i MFR_PRIVAT_NOKKEL (packages/sources/src/mfr/index.ts).
  • Den offentlige delen er registrert i Samarbeidsportalen hos Digdir.
  • Nøkkelen signerer en kort grant (RS256, node:crypto). Granten lever i 120 sekunder og har et engangsnummer (jti), så den ikke kan brukes igjen (packages/sources/src/maskinporten/index.ts).
  • Access tokenet holdes bare i minnet, nøklet på klient, scope, foretak og API. Det lagres ikke i databasen.
  • Nøkkelen og tokenet logges aldri, lagres aldri og sendes aldri til en språkmodell. Feilmeldinger har bare HTTP-status og Maskinportens feilkode.
  • Produksjon skal ha en egen nøkkel, ikke testnøkkelen (docs/rrh-tilgang.md, «Veien til prod»).
  • En feilformatert nøkkel oppfører seg som en manglende nøkkel: oppslaget blir «ikke-tilgang», og pipelinen stopper ikke.

6. Hvem har nøklene

  • Hemmelighetene i Vercel: de som har tilgang til Vercel-prosjektet (tilgangsstyring, punkt 3).
  • Utviklerens .env.local: brukes av skriptene i packages/db/scripts/.
  • Maskinporten-klienten: de som har tilgang i Samarbeidsportalen.

7. Bytte av nøkler

Verid har ingen fast rutine for å bytte nøkler. En nøkkel byttes i dag bare når det er en grunn. Ved en lekkasje eller når en person med tilgang slutter:

  1. Lag en ny nøkkel hos leverandøren (for Maskinporten: legg til ny offentlig nøkkel i Samarbeidsportalen før den gamle fjernes).
  2. Sett den nye verdien i Vercel for produksjon, og for preview hvis den brukes der.
  3. Rull ut på nytt, og kontroller at funksjonen virker.
  4. Slett den gamle nøkkelen hos leverandøren.
  5. Skriv i hendelsesnotatet hvilken nøkkel som ble byttet, og når.

Gjenstår

MangelRisikoPlan
Ingen fast rutine eller frist for å bytte nøklerEn lekket nøkkel kan virke lengeBytt alle nøkler minst én gang i året, og når noen med tilgang slutter
Produksjonsnøkler ligger i .env.local på utviklerens maskin, også i gamle sikkerhetskopier av filenEn tapt maskin kan gi tilgang til databasenSlett gamle kopier. Krypter disken. Bruk en egen nøkkel med minst mulig tilgang for skript
Ingen oversikt over hvem som har sett hvilken hemmelighetVed en lekkasje vet vi ikke hva som må byttesFør en liste over hemmeligheter, eier og sist byttet
Maskinporten-nøkkelen i produksjon har ingen dokumentert utløpsdatoEn nøkkel kan bli brukt i mange årSett en fast levetid og legg byttet inn i rutinen over