Data blir viktigere og viktigere. Hvert år blir mer og mer data samlet inn – av flere aktører og på flere måter. Med denne økningen i mengden data har det også skjedd en økning i antall trusselaktører.
Jeg mener derfor at alle utviklere bør kunne litt om kryptografi.
Alt fra tenåringer på gutterommet til nasjonalstater ønsker nå å hacke oss og stjele dataen vår. Dette har brakt nye utfordringer om hvordan man skal håndtere data, og hvordan denne dataen skal holdes trygg.
Videre er det kommet flere lover og regler om hvordan vi skal håndtere data, og spesielt hvordan vi skal håndtere brukerdata. Flere lovgivende aktører har kommet på banen, som for eksempel EU med GDPR og Schrems II. Det er flere tiltak som er nødvendig for å holde dataen vår trygg.
Et av de beste tiltakene er å bruke kryptografi.
"Don't roll your own crypto"
De fleste som har gjort noe som helst relatert til kryptografi har hørt det kjente ordtaket "don't roll your own crypto". Dette er et godt råd. Du burde ikke designe dine egne kryptografiske algoritmer eller implementere egne kryptografi-biblioteker. Kryptografi er full av fallgruver, og hvis man prøver å lage sin egen kryptografi så kommer det til å gå galt.
Dessverre er det likevel mange feil man kan gjøre selv om man ikke forsøker å snekre kryptografien selv:
- Du må velge hvilken algoritme som skal brukes.
- Du må velge hvilket kodebibliotek som skal brukes.
- Du må bruke biblioteket på en trygg måte.
- Du må konfigurere andre kryptografiske løsninger som for eksempel TLS
- Du må avgjøre hvilken kryptografisk løsning som egner seg for din problemstilling.
I alle disse stegene er det veldig mye som kan gå galt. Det er derfor viktig at utviklere har tilstrekkelig kunnskap om kryptografi til å gjøre fornuftige valg.
Kryptologer: - Krypto betyr ikke kryptovaluta!
Det er vanskelig å bruke kryptografi riktig. I OWASP sin topp 10 liste over sikkerhetsfeiler i webapplikasjoner for 2021 plasserte de kryptografiske problemer på 2. plass. OWASP peker til flere problemer på hvordan kryptografi brukes. Dette er blant annet dårlig valg og feil bruk av algoritmer, samt mangel på kryptografi i situasjoner hvor kryptografi burde brukes.
Disse problemene oppstår delvis fordi utviklerne ikke er flinke nok til å bruke kryptografi, men en annen faktor er at mange kryptografi-biblioteker og verktøy er lite brukervennlig.
Faktorer som gjør kryptografi vanskelig for oss utviklere
Mange kryptografibiblioteker er dårlig dokumentert, veldig lavnivå, tillater usikker bruk, gir deg mer kontroll enn du trenger og er for lite opinionated, altså de overlater for mange valg til brukeren.
Om man bruker kryptografi riktig eller ikke kommer ofte an på om man velger riktig kodebibliotek.
Videre er det vanskelig å finne gode kilder for hvordan man bruker kryptografi riktig. Veldig mange Stackoverflow-svar om kryptografi gir dårlige råd og usikker kode.
Hvis du faktisk klarer å finne gode kilder til informasjon om hvordan bruke kryptografi riktig, så er det også vanskelig å lese denne informasjonen. For eksempel så gir Latacora veldig gode råd om hvilke algoritmer som egner seg for diverse problemstillinger, men for å faktisk skjønne det Latacora skriver, så må man ha en del kunnskap om kryptografi.
Disse faktorene gjør det vanskelig for utviklere å bruke kryptografi riktig.
«Veldig mange Stackoverflow-svar om kryptografi gir dårlige råd og usikker kode.»
Valg av kodebibliotek er veldig viktig
Valg av kodebibliotek har en stor påvirkning på hvor vanskelig det er å bruke kryptografi riktig. Hvis man bruker et lite opinionated bibliotek så får man mye frihet, inkludert friheter til å gjøre feil.
I mange biblioteker er utvikleren selv nødt til å definere diverse kryptografiske parametere. I et bra kryptografi-bibliotek blir disse parametrene håndtert internt i biblioteket.
Et eksempel på dette er C-biblioteket libsodium. Libsodium er en av de mest brukervennlige kryptografi-bibliotekene som finnes. Målet til libsodium er å abstrahere vekk så mye av kryptografien som mulig, Hvis du ønsker å generere en offentlig nøkkel i libsodium så bruker du crypto_box_keypair()-funksjonen. Du trenger ikke bry deg om hvilken algoritme som brukes, hvordan algoritmen brukes eller valg av parametere i algoritmen.
Slik fungerer public og private keys
I de fleste situasjoner så burde man bruke libsodium, men libsodium alene er ikke tilstrekkelig. Man trenger fortatt en viss grad med kryptografikunnskap. Selv om libsodium abstraherer vekk veldig mye av kryptografien, så er det fortsatt noen kryptografiske konsepter man må forholde seg til når man bruker det. Som for eksempel nonces.
I tillegg så må du vite om bruksområdet til de diverse funksjonene i libsodium. Hvis du bruker libsodium, så betyr det at du ikke trenger å vite i detalj hvordan for eksempel symmetrisk eller asymmetrisk algoritmer fungerer, men du må fortsatt forstå hvilke problemstillinger symmetrisk og asymmetrisk kryptografi egner seg til.
Til slutt så er det heller ikke alle prosjekter man har muligheten til å bruke libsodium, og libsodium egner seg ikke i alle problemstillinger. Libsodium har ingen TLS-funksjonalitet, så hvis man skal bruke TLS så burde man bruke OpenSSL.
Kryptografi er uunngåelig
Der er kanskje noen som tenker at kryptografi ikke er relevant for dem fordi de aldri kommer til å gjøre noe kryptografisk. Jeg påstår at kryptografi er såpass utbredt at alle må ha et visst forhold til det.
De aller fleste utviklere kommer til å møte på kryptografi, vanligvis i form av TLS. TLS er en av verdens mest brukte kryptografiske løsninger, og det er sannsynlig at du en gang blir nødt til å bruke det. Dette kan være alt fra å konfigurere TLS på en server til å fornye sertifikater. Selv om du ikke sitter og konfigurerer TLS-servere på daglig basis, så burde du fortsatt ha kjennskap til det.
Du burde kjenne til TLS og kryptografi på samme måte som du burde kjenne til cross site scripting og sql injection-angrep.
«Alle har sin rolle i å holde dataen vår trygg.»
Hva bør vi utviklere gjøre?
Hvor mye du burde kunne om kryptografi varierer basert på hva du jobber med.
Hvis du er en utvikler som ikke gjør noe direkte relatert til kryptografi så burde du hvertfall ha kjennskap til TLS, og kanskje grunnleggende kunnskap om de kryptografiske byggeblokkene som hash-funksjoner, public-private-kryptografi, osv.
Utviklere burde også være i stand til å avgjøre hvor de burde bruke kryptografi, for eksempel om de burde kryptere innholdet i en database. Hvis du noen gang skal direkte bruke kryptografi så burde du ha god kunnskap om hvordan verktøyene du bruker funker, og hvordan du skal bruke dem riktig. Du burde også vite at libsodium eksisterer, og bruke libsodium når du har muligheten.Sikkerhet er et felles ansvar.
Alle har sin rolle i å holde dataen vår trygg. Vi utviklere er ansvarlig for å bygge løsninger som tar hensyn til dagens sikkerhetsutfordringer. Dette ansvaret innebærer at vi kan litt om kryptografi. Å bruke kryptografi byr på mange utfordringer, og det er mye en utvikler må vite for å kunne bruke det på en trygg måte.
Det er mye man kan lære, men det som er aller viktigst å vite er at kryptografi er vanskelig, og det er veldig mye som kan gå galt hvis man er uforsiktig.
Referanser/ressurser nevnt i artikkelen: