Kryptografi

Kryptografin bakom Velamen

Vi tror inte på säkerhet genom hemlighetsmakeri. Ett kryptografiskt system som bara är säkert så länge ingen vet hur det fungerar är inte säkert. Den här sidan beskriver exakt vilka algoritmer och kryptografiska metoder Velamen använder för att skydda journaldata, i den detalj en säkerhetsgranskare eller nyfiken kollega faktiskt behöver.

Snabbt: primitiven vi använder

  • Symmetrisk kryptering: ChaCha20-Poly1305 (autentiserad kryptering, AEAD) för allt klinsikt innehåll, bilagor och nycklar.
  • Asymmetrisk nyckeldelning: X25519-nyckelpar (elliptisk kurva, Curve25519) för att dela symmetriska nycklar mellan behöriga användare.
  • Lösenordsbaserad nyckelderivation: Argon2id för att härleda en nyckel från ditt lösenord eller din återställningsfras.
  • Nyckelderivation från befintlig nyckel: HKDF för att härleda separata, kontextbundna nycklar (till exempel sökindexnyckeln) från en huvudnyckel.
  • Sökbara krypterade fält: HMAC-SHA256 för deterministisk hashning i så kallad blind indexering.
  • Återställningsfras: BIP-39, samma standard som används för kryptovalutaplånböcker, för en läsbar 12-ordsfras.
  • Multifaktorautentisering: TOTP (tidsbaserade engångskoder) och WebAuthn-passkeys, valfritt hårdvarubundna via PRF-tillägget.

Kryptering av klinisk data

Allt kliniskt innehåll (journalanteckningar, patientuppgifter och bilagor) krypteras med ChaCha20-Poly1305, en modern AEAD-algoritm (Authenticated Encryption with Associated Data) som både krypterar innehållet och garanterar att det inte har manipulerats. Varje journal och patient har en egen slumpmässigt genererad 32-byte symmetrisk nyckel. Krypteringen sker alltid lokalt på din enhet innan något skickas till servern.

Bilagor hanteras på samma sätt, men krypteringen sker i en separat, lokal komponent snarare än direkt i webbläsaren, för att minska risken för att skript i webbläsaren någonsin kommer i kontakt med okrypterat innehåll.

Nyckelhierarki

Velamen bygger på en hierarki av nycklar, där varje nyckel har ett tydligt avgränsat syfte:

  • MEK (huvudnyckel): En slumpmässig 32-byte ChaCha20-Poly1305-nyckel som genereras lokalt vid registrering. Den är roten till din identitet och lämnar aldrig din enhet i klartext.
  • KEK (nyckelinpackningsnyckel): Härleds med Argon2id från antingen ditt lösenord eller din 12-ordsfras, och används för att kryptera (paketera in) MEK inför lagring hos oss.
  • X25519-nyckelpar: Härleds deterministiskt från din MEK och används för att asymmetriskt dela symmetriska nycklar med andra behöriga användare, utan att din MEK någonsin behöver delas.
  • Klinikens huvudnyckel: En egen 32-byte nyckel per klinik, skapad av den första administratören och delad asymmetriskt till behörig personal.
  • Sökindexnyckel: Härleds från klinikens huvudnyckel via HKDF och används enbart för att beräkna sökbara hashvärden, aldrig för att kryptera innehåll.

Sökning utan att avslöja innehåll

För att kunna söka i krypterad data utan att servern någonsin ser klartext använder Velamen blind indexering: sökbara fält hashas deterministiskt med HMAC-SHA256 och en dedikerad sökindexnyckel, skild från nyckeln som används för att kryptera själva innehållet. Servern kan då matcha exakta sökträffar mot hashvärden, utan att kunna räkna baklänges till klartexten eller läsa innehållet.

Lösenord, återställning och multifaktorautentisering

Ditt lösenord skickas aldrig i klartext till servern. Inloggningslösenordet hashas separat från den nyckelderivation som låser upp din MEK, och servern lagrar endast Argon2-hashar, aldrig lösenord i klartext. Om du glömmer ditt lösenord kan du återställa åtkomsten med en 12-ords återställningsfras genererad enligt BIP-39-standarden, vilket kryptografiskt återskapar din huvudnyckel utan att kringgå kravet på multifaktorautentisering.

För att uppfylla Socialstyrelsens krav på stark autentisering krävs alltid en andra faktor utöver lösenordet: antingen en tidsbaserad engångskod (TOTP) eller en passkey enligt WebAuthn-standarden. Passkeys kan valfritt hårdvarubindas till din enhet via WebAuthns PRF-tillägg, vilket gör att nyckelvalvet på enheten inte går att låsa upp ens om filerna stjäls från en annan dator.

Nycklars livslängd och framåtsäkerhet

När en medarbetares åtkomst till en klinik återkallas byts klinikens huvudnyckel ut mot en ny version. Nya journaler krypteras direkt med den nya nyckeln, så en återkallad medarbetare får ingen åtkomst till något som skapas därefter, så kallad framåtsäkerhet. Äldre nycklar kedjas och packas in i den nya nyckeln i stället för att varje enskild journal behöver packas om, vilket gör att en administratör aldrig behöver hämta eller hantera krypterat patientinnehåll bara för att en behörighet ändras.

Nycklar som tillfälligt behöver finnas i arbetsminnet, till exempel vid en nödöppning, nollställs aktivt så fort de inte längre behövs, i stället för att bara lämnas kvar och vänta på att skräpsamlas.

Varför vi berättar det här

Ett vanligt kryptografiskt principiellt ställningstagande är att ett systems säkerhet ska vila på hur väl nycklarna skyddas, inte på att metoden hålls hemlig. Genom att öppet beskriva vilka algoritmer vi använder blir det möjligt för säkerhetsmedvetna kunder, granskare och forskare att faktiskt bedöma styrkan i skyddet, i stället för att behöva ta vårt ord för det.

Läs mer om säkerhetsarkitekturen i stort, om spårbarhet och loggning, eller kontakta oss på kontakt@velamen.se om du har fler frågor.