Most recent comments
Liveblogg nyttårsaften 2017
Tor, 11 months, 2 weeks
Jogging og blogging
Are, 1 year, 11 months
Liveblogg nyttårsaften 2016
Are, 1 year, 11 months
Reading in dark times
Are, 2 years, 1 month
Moldejazz 2016
Camilla, 2 years, 4 months
Dørskilt
Karoline, 2 years, 5 months
Halifax
Tor, 2 years, 5 months
Sony Smartwatch 3 review
Tor, 2 years, 6 months
Numerikk, takk
Tor, 2 years, 6 months
Topp tur
Camilla, 2 years, 8 months
50 book challenge
Camilla, 11 months, 2 weeks
Controls
Register

Salted hash

I dag tenkte jeg at jeg skulle skrive en liten artikkel om passord. Ikke en slik moraliserende artikkel om at du bør velge gode passord, men en informativ sak om hvordan passord lagres og sjekkes. Den metoden jeg beskriver her er den som benyttes som standard i django, men jeg tror det er en ganske vanlig måte å gjøre ting på.

Hvis man er registrert på et seriøst nettsted, og ber om å få en slik «glemt passord»-epost, vil du aldri få ditt opprinnelige passord tilsendt. Grunnen til det er at seriøse nettsider ikke lagrer passordet ditt. Det de derimot gjør er å lagre hash-verdien av passordet ditt. Så hva er egentlig en hash-verdi?

En hash-funksjon er en funksjon som tar et stykke tekst, eller forsåvidt en hvilken som helst fil, og regner ut et tall fra denne teksten. For eksempel, hvis jeg benytter algoritmen kjent som md5* til å regne ut hash-verdien av "passord" (skriv md5 -s passord i terminalen) får jeg

MD5 ("passord") = 56f491c56340a6fa5c158863c6bfb39f

eller hvis jeg bruker et annet ord, for eksempel "rosaelefanter", får jeg

MD5 ("rosaelefanter") = a40cb06007fd2c80686ba50a2aab3e73

eller jeg kan bruke en fil, for eksempel en pdf jeg har på maskinen min, og jeg får

MD5 (test.pdf) = 8e5e7e38fb968fea13e4ad0b4c990009

Man får altså et langt tall, alltid like langt, uansett hva man putter inn. Så hva er poenget med dette? Vel, fra et sikkerhetsperspektiv er det to (og sikkert flere) ting dette er nyttig til. Det første er for å verifisere filer. For eksempel, hvis noen du kjenner skal sende deg en fil, og du ønsker å være sikker på at ingen har tuklet med filen. Da kan de regne ut hash-verdien av filen før de sender den, for deretter å sende deg hash-verdien gjennom en sikker kanal, for eksempel pr. telefon. Det gjør ikke noe om telefonlinjen blir avlyttet, poenget er at du må være sikker på at informasjonen kommer fra riktig person. Når du så mottar filen kan du selv regne ut hash-verdien med samme funksjon, og hvis den stemmer kan du være sikker på at det er den samme filen.

På et litt mindre paranoid nivå (men fortsatt nokså paranoid) kan man bruke dette til å sjekke om man har lastet ned en fil uten feil. Mange typiske nerde-ting, som uavhengig programvare og linux-distroer, oppgir hash-verdier for alle filene de legger ut.

For at dette skal fungere er det viktig at man ikke kan lage to filer med samme hash-verdi. Siden hash-verdien bare er et relativt lite tall, mens filen man beregner fra kan være hur stor som helst, er det åpenbart at det kan finnes mange filer med samme hash-verdi. Sikkerheten beror på at man ikke må kunne designe en fil med en bestemt hash-verdi. Siden det finnes veldig mange mulige hash-verdier gjør det at det er overveiende sannsynlig at en fil som er bekreftet med en hash-verdi faktisk inneholder det du tror.

Denne metoden brukes også til verifisering av passord. Som jeg sa vil ikke en nettsted du registrerer deg på lagre passordet ditt. De vil derimot lagre hash-verdien av passordet ditt. Neste gang du forsøker å logge deg på regner de ut hash-verdien av passordet du oppgir, og hvis den stemmer med den de har lagret betyr det at passordet stemte. Det gunstige med dette er at det gjør strengt tatt ikke noe om noen leser filen der hash-verdiene er lagret. Det er umulig, eller i alle fall latterlig vanskelig, å finne ut passordet fra hash-verdien, og hash-verdien i seg selv har ingen nytte, for den kan ikke brukes som passord.

I virkeligheten gjør man ting enda litt vanskeligere, ved å bruke noe som heter salted hash. I tillegg til å lagre hash-verdien av passordet lagrer man også et tall som kalles salt. Dette er et tilfeldig tall som blir generert første gangen passordet blir registrert. Det man så gjør er legge dette tallet til passordet, før man regner ut hash-verdien.

Og hvorfor gjør man så det? Jo, grunnen er at det er mulig, hvis man kjeder seg litt en dag, å sette seg ned og lage en tabell over hash-verdiene til for eksempel alle ordene i Oxford English Dictionary. Hvis man har en slik tabell, og får tak i hash-verdien til noens passord, er det en smal sak å sammenligne de to for å sjekke om et av ordene i listen er brukt som passord. Ved å legge til et tilfeldig tall foran hvert passord gjør man det umulig å bruke en forhåndsgenerert slik tabell.

Såh. Da vet du det.

-Tor Nordam

*Ikke bruk md5 til noe viktig. I 2005 ble det oppdaget at det er ganske lettvint å designe filer med ønsket md5-sum, så denne metoden er ikke sikker. Bruk sha-1 eller noe slikt.

Comments

Camilla,  19.11.09 01:09

Spennende, spennende. md5 og sha-1 sier meg ingenting i hele verden, men jeg har jo vært borti nytten av dette når jeg har utvekslet filer med deg og de har blitt korrumpert på veien. Jeg er en stor tilhenger.

Ulf,  19.11.09 21:43

Torrent har innebygd hash-sjekking på partene av filene. Det var det avgjørende argumentet mitt for å skifte fra DC++ med sfv-sjekk (på fortrinnsvis musikk) til torrent.

Anders G.,  20.11.09 00:16

Jeg kan jo nevne at Calcuttagutta har lagret passordene deres på denne måten siden starten.
Category
Technology
Tags
django
passord
salted hash
Views
2417