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=63072000ber nettleseren bruke bare HTTPS i to år (apps/web/next.config.ts, og Vercel setter også hodet). UtenincludeSubDomainsogpreload, med vilje. Informasjonskapselen for sesjonen erSecurei produksjon (useSecureCookiesipackages/auth/src/auth.ts). - Verid til databasen: TLS til Neon.
- Verid til kildene og underleverandørene: HTTPS. Alle adresser i
packages/sources/src/erhttps://(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:
| Data | Hvor | Kryptering |
|---|---|---|
| Databasen | Neon | Kryptert på disk hos Neon |
| Rapportarkivet (PDF/A) | Vercel Blob | Kryptert på disk hos Vercel. Privat tilgang: en fil kan ikke hentes uten nøkkel (access: "private" i apps/web/lib/kjoring/arkiv.ts) |
| E-post | Resend | Etter 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.
| Hva | Hvordan | Hvor | |
|---|---|---|---|
| Lenken til kundeerklæringen | 24 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 rapport | SHA-256 av en kanonisk form av søkene (rapport.bevis_sha256) | packages/pipeline/src/bevis.ts | |
| Den arkiverte PDF-en | SHA-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.
| Hemmelighet | Hva den gjør | Hva som skjer ved bytte |
|---|---|---|
BETTER_AUTH_SECRET | Signerer informasjonskapslene for sesjonen | Alle brukere logges ut (.env.example) |
DATABASE_URL, DATABASE_URL_UNPOOLED | Full tilgang til databasen | Bytt passord i Neon, oppdater Vercel, rull ut |
BLOB_READ_WRITE_TOKEN | Lese og skrive rapportarkivet | Settes av Vercel når Blob kobles til |
CRON_SECRET | Beviser 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_KEY | Sende e-post | E-post stopper til ny nøkkel er satt |
OPENSANCTIONS_API_KEY, SERPER_API_KEY | Kall til leverandørene | Søket blir «ikke-tilgang» til ny nøkkel er satt |
MATRIKKEL_USER, MATRIKKEL_PASS | Grunnboken hos Kartverket | Grunnboken blir et sjekklistepunkt |
MASKINPORTEN_PRIVAT_NOKKEL, MFR_PRIVAT_NOKKEL | Se punkt 5 | Se 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 iMFR_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 ipackages/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:
- Lag en ny nøkkel hos leverandøren (for Maskinporten: legg til ny offentlig nøkkel i Samarbeidsportalen før den gamle fjernes).
- Sett den nye verdien i Vercel for produksjon, og for preview hvis den brukes der.
- Rull ut på nytt, og kontroller at funksjonen virker.
- Slett den gamle nøkkelen hos leverandøren.
- Skriv i hendelsesnotatet hvilken nøkkel som ble byttet, og når.
Gjenstår
| Mangel | Risiko | Plan |
|---|---|---|
| Ingen fast rutine eller frist for å bytte nøkler | En lekket nøkkel kan virke lenge | Bytt 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 filen | En tapt maskin kan gi tilgang til databasen | Slett gamle kopier. Krypter disken. Bruk en egen nøkkel med minst mulig tilgang for skript |
| Ingen oversikt over hvem som har sett hvilken hemmelighet | Ved en lekkasje vet vi ikke hva som må byttes | Før en liste over hemmeligheter, eier og sist byttet |
| Maskinporten-nøkkelen i produksjon har ingen dokumentert utløpsdato | En nøkkel kan bli brukt i mange år | Sett en fast levetid og legg byttet inn i rutinen over |