Sikre passord med Blowfish

I løpet av den siste uken hadde jeg en ide om hvordan jeg enkelt kan røde flagg potensielle arbeidsgivere: be om å se en rad på brukerbordet og se på passordfeltet. Hvis passordet er i klartekst, kan du løpe for døren.

Når selskaper som Blizzard lider av hacking av autentiseringssystemer, og ser ut til å være sårbare for angrep i ordbokstil, eksisterer det et problem som er endemisk i hele bransjen.

Som IT-fagfolk forventer jeg at mange av oss har kommet over registrerings- og påloggingssystemer som får sveitsisk ost til å se ugjennomtrengelig til sammenligning.

Den triste virkeligheten er at dette er lett å fikse.

Passord beskytter brukerne dine, ikke deg

Årsakene til å lagre passord som hasj er ikke for å forhindre at systemet ditt blir sprukket. det er for å beskytte brukerne i tilfelle brudd. Fordi brukere er mennesker, og derfor late, vil de bruke passord om og om igjen. En brukers online og offline identitet skal ikke trues fordi systemene dine ikke kunne sikres ordentlig.

I tilfelle brudd, bør brukerens passord beskyttes tilstrekkelig til å avskrekke hackeren fra å til og med forsøke å brute tvinge et passord eller henvende seg til ordboksangrep eller regnbue-tabeller.

Kast ut md5 / sha1 og hent saltet

Hvis du for tiden bruker md5 eller sha1, er den beste måten å demonstrere at du er sårbar å gå over til crackstation.net og se hvor enkelt det er å knekke md5, sha1 og andre hashingmetoder med oppslagstabeller.

Selv om du bruker sterk passfraser med flere titalls tegn, og øker tastaturet ved å bruke blandet bokstav og symboler, vil noen av brukerne dine bruke svake passord. Og de vil være de første som går når ordboksangrepet brukes.

Den første forsvarslinjen er å injisere et salt i det lagrede passordet. Å bruke et salt gir en måte å gjøre passord på lenger, og tilfører litt tilfeldighet til svake passord.

Den ene påminnelsen er at saltet må være unikt for hver bruker - det gjør ikke noe godt å hardkode et standard salt i kildekoden og forvente at det skal være nok.

Når det gjelder hack, er det rimelig å anta at hvis databasen din har blitt kompromittert, så er det sannsynlig at kildekoden din også er kompromittert. I en slik situasjon kan man forvente at eventuelle hardkodede salter eller serier med hasj på hasjer, for eksempel sha1 (md5 ($ passord)), vil bli oppdaget, og la en ordbok raskt bygges for å angripe databasen din.

Selv når det gjelder et unikt salt for hver bruker, kan en hacker fremdeles bygge et skreddersydd ordbok eller regnbue-bord for å avkode et passord for personer som er høyprofilerte og / eller lønnsomme nok. Dette blir gjennomførbart når datakraft har nådd det punktet hvor hundrevis av millioner md5-hasj kan beregnes per sekund.

Det som trengs er en metode for å avskrekke en hacker fra til og med å forsøke å angripe en individuell bruker i utgangspunktet.

Gå inn i Blowfish

Det finnes et mangfold av løsninger som hver har sine fordeler, men for denne artikkelen vil vi fokusere på Blowfish-algoritmen utviklet av Bruce Schneier. Den viktigste grunnen er at det er en naturlig implementering for Blowfish i PHP 5.3.7 og nyere, og bibliotekimplementeringer tilgjengelig for PHP 3.0.18 og nyere.

For å benytte Blowfish i PHP, må vi påkalle kryptfunksjonen. Saltet for Blowfish har form av algoritme koster $ 22 sifre fra "./0-9A-Za-z" som salt, der algoritmen er "$ 2y $" og kostnaden er en base-to-logaritme, som bestemmer hvor mange iterasjoner som skal gjøres mellom 2 ^ 4 til 2 ^ 31 (16 til 2147483648). Et fullstendig eksempel ville være et salt på "$ 2y $ 14 $ wHhBmAgOMZEld9iJtV. / Aq".

Kostnadsfaktoren er en viktig del av Blowfish, og er ment å øke beregningskraften som kreves for å brute tvinge passordet. I eksemplet ovenfor, gjør vi 16 384 (2 ^ 14) iterasjoner av Blowfish før vi produserer resultatet. Øk kostnadsfaktoren i de høye tjueårene for å se tiden som trengs for å beregne en enkelt hasj.

For å implementere det, følgende linje:
crypt("testbahbah", "$2y$14$wHhBmAgOMZEld9iJtV./aq"); 
gir oss en resulterende hasj av
 $2y$14$wHhBmAgOMZEld9iJtV./aeunF8UBxc5UA0AqDnqZ0MQ1ivv2Y0SUG 

Det som gjør dette ekstremt nyttig er at de første 28 tegnene til hasjen inneholder saltet som vi brukte tidligere, så vi trenger ikke å lagre det separat. Dette betyr at vi senere kan kontrollere hasjens gyldighet ved å bruke resultatet vårt som saltet.

Så hvis vi skulle teste kryptskoden som ble brukt ovenfor, ville vi brukt:

 if(crypt($password_to_check, $password_hash) == $password_hash) { 

// gyldig passord

}

Du kan innse at "$ 2y $ 14 $ wHhBmAgOMZEld9iJtV. / Aq" ikke er en eksakt match med "$ 2y $ 14 $ wHhBmAgOMZEld9iJtV. / Ae". Dette skjer fordi Blowfish bruker en 128-bits hash, men 28 tegn på hex er 132 biter. Måten dette løses på er at de fire siste bitene slippes, og dermed endringen i den siste karakteren som deles mellom saltet og hasjen. Faktisk slippes alle fremmede biter i saltet, så krypt ($ password_to_check, $ password_hash) er like gyldig som crypt ($ password_to_check, $ password_hash. "011111000").

Hvis du ser på internett for en implementering av Blowfish, må du sørge for å sjekke hvordan saltet blir generert. Jeg har sett altfor mange innlegg som bruker en form for sha eller md5-hashing for å generere saltet. Dette resulterer i å kutte saltspråket fra 63 mulige tegn ned til 16.

En enkel måte å generere saltet på ville være:
 $salt = "$2y$14$"; 

for ($ i = 0; $ i <22; $ i ++) {

$ salt. = substr ("./ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand (0, 63), 1);

}

Disse få kodebitene bør være nok til å starte deg på vei til å implementere et Blowfish-autentiseringssystem. Ikke vær bekymret for å lagre full hasj i en database; det er slik det er ment å være.

Et lite skritt

Mens Blowfish er et fint utgangspunkt, er det ikke sluttspillet i beskyttelse.

Det er mange bedre algoritmer tilgjengelig i PHPs mcrypt-utvidelse. De involverer en smule mer arbeid og forståelse enn Blowfish, men hvis du virkelig ønsker å bli seriøs om passordbeskyttelse og ta kryptering lenger enn bare passord hashing, er det vel verdt å lese.

© Copyright 2021 | pepebotifarra.com