Grunnleggende kryptografi for webutviklere

Kryptografi er kanskje et av de mest kompliserte fagene en webutvikler må forholde seg til. Og faktum er at man ikke slipper unna. Problemet med kryptografi er nettopp kompleksiteten. Mange gjør mye riktig, men de vet ikke selv hvorfor det er riktig, eller hvilke fallgruver som finnes.
I denne artikkelen skal vi se på grunnleggende kryptografi. Vi skal gå gjennom de ulike måter å sikre data på og hvordan vi kan gjøre det i praksis med sikkerhetsbiblioteket phpSec.

Hva er kryptografi

Fra Wikipedia:

Kryptografi er læren om lingvistiske og matematiske teknikker for å sikre informasjon mot innsyn eller modifikasjon, som oftest i forbindelse med kommunikasjon.

I hovedsak er det to krypteringsmetoder som er aktuelle for en webutvikler; sjekksummer og symmetrisk kryptering. I tillegg skal vi se kort på det som kalles asymmetrisk kryptering.

Sjekksum

Den første krypteringsmetoden vi skal se på er sjekksum også kalt hashing. Sjekksum er i utgangspunktet en metode for å kontrollere integriteten til for eksempel en fil eller en melding. En sjekksum algoritme vi alltid produsere samme resultat hvis den data du produserer en sjekksum av er den samme. Dette gjør den utmerket til lagring av passord. Ved å bare lagre en sjekksum av et passord trenger man ikke å lagre en klartekst versjon av passordet. Den vanligste sjekksumalgoritmen er MD5, til tross for svakheter i metoden. MD5 vil alltid produsere en 128-bits sjekksum, denne er som regel alltid presentert som et 32-tegns heksadesimalt tall. Vi kommer i denne artikkelen til å benytte oss av SHA256, en langt kraftigere algoritme som produserer 64-tegns heksadesimalt tall.

Salting

De siste årene har metodene for lagring og oppbevaring av passord forandret seg dramatisk. Mye av dette skyldes store databaser av forhåndslagrede sjekksummer. Selv om en sjekksum algoritme er en enveis prosedyre, så er det mulig å finne ut hvilken data som ble brukt til å lage en sjekksum rett og slett ved å kontrollere alle mulige kombinasjoner, og lagre disse i en stor database. For å sikre oss mot dette bruker vi noe som kalles for et salt, når vi lagrer et passord. Dette vil øke tiden det vil ta å lage en database med alle mulige passord fra kanskje 1 år til 100 år. Det man gjør er å lage en tilfeldig streng med data som man setter sammen med passordet. Deretter lagrer man både salt og sjekksummen i databasen. Samme salt brukes så når man skal kontrollere om passordet er korrekt.

Eksempel på sikker lagring av passord

Dette eksempelet benytter seg av phpSec sine passord funksjoner som bruker det som ansees å være de beste metodene for laging av salt og passord sjekksummer.

Hvis du ser på hva som lagres i databasen ($hash) inneholder ikke det passordet til brukeren, men kun en sjekksum og et salt.

{
"hash":"58f0ba725e9dd3191eb022a5b3bd1eaf3de97f1e453f59ba7f8b5c2d44624c4b",
"salt":"2011-02-06T13:43:02Z0d5347385584c269c56f4de0e74190",
"algo":"sha256",
"injection":"before"
}

Dersom en angriper skulle få tilgang til sjekksummen vil han ikke ikke bruke den til å få urettmessig tilgang til brukeren sin konto siden han ikke vet hva passordet er. Og det trenger han for å logge inn. Det finnes dog en svakhet med denne metoden: En angriper kan lage sjekksummer med saltet sammen med alle mulige kombinasjoner av passord men dette vil ta fryktelig lang tid og bare gi tilgang til en konto siden saltet er forskjellig hver gang. Du kan lese mer om passord sjekksummer og phpSec i phpSec wikien.

Symmetrisk kryptering

Symmetrisk kryptering er i motsetning til sjekksummer en toveis kryptering. Denne type kryptering brukes til å hindre uautorisert innsyn i data mens sjekksummer kun kan benyttes til å kontrollere integriteten til data.
De symmetriske krypteringsalgoritmene som er vanlige i dag er veldig sterke, så problemet med denne metoden kryptering er distribuering av nøkler. Nøkkelen er det eneste som beskytter informasjonen fra innsyn, så den som kjenner nøkkelen kan lese informasjonen.
Det er ingenting galt med å benytte symmetrisk kryptering så lenge du kan distribuere nøkkelen på en sikker måte. Dersom personen som krypterer data er en annen en den som skal dekryptere den kan det være en fordel å vurdere asymmetrisk kryptering som vi skal se på litt seinere.

Som du ser av eksempelet under er symmetrisk kryptering veldig enkelt med phpSec.

Asymmetrisk kryptering

Asymmetrisk kryptering, ofte kjent som public key encryption på engelsk benytter seg av to forskjellige nøkler. En som bare kan brukes til å kryptere data: den offentlige nøkkelen. Og en som kan brukes til å dekryptere data: den private nøkkelen. Den private nøkkelen er ofte kryptert med et passord for å hindre uautorisert bruk. Jeg skal ikke bruke så mye tid på asymmetrisk kryptering, men dersom du er nyskjerrig finner du god informasjon på følgende nettsteder:

Konklusjon

Dette har vært en kort innføring i et veldig kompliser emne. Jeg har vist hvordan man enkelt kan komme i gang med kryptografi i dine PHP applikasjoner med phpSec biblioteket. Denne artikkelen tar ikke for seg hvordan man skal beskytte krypteringsnøkler da dette er et svært komplisert emne.

Kopirett © 2008-2011 Audun Larsen.
Noen rettigheter reservert.
Blogglisten
RSS
Drupal theme by Kiwi Themes.