Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  35 2248
Hvis du skal lagre passord i databasen, så lagrer de fleste de i MD5. Dette gir da middels sikkerhet, men hvis noen finner hashen, så kan de jo bare søke i sine rainbowtables for å finne passordkombinasjonen? Så hvorfor ikke kjøre MD5 to ganger på passordet? Vil dette øke sikkerheten nå mye? Det vil jo nesten gjøre det umulig å finne det, eller tar jeg feil?
Sist endret av jeppfi; 9. juni 2009 kl. 15:26.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Men... men... tenk om de Rainbow Tabler det to ganger, da?
Eller du kan bare bruke SHA1 som PHP og muligens (hvis jeg husker riktig) MySQL har innebygd støtte for.
m0b
m0b's Avatar
DonorAdministrator
Ja, det går godt an å gjøre det slik. En vanlig greie å gjøre er å bruke et salt når det genereres hasher. På denne måten er du ikke kun avhengig av én funksjon, men funksjon og salt.

Kode

hash = algoritme( passord + salt )
robhol: De skal ha noen TB med rainbowtables for å klare å gjøre hele den der to ganger.


Kode

$hast = 'test';

$salt = 'md5';

$hash = md5($hash . $salt);
Slik du tenkte det?

Og er SHA1 sikrere enn MD5?
Sist endret av jeppfi; 9. juni 2009 kl. 15:35.
md5 er knekt for lenge siden så du bør benytte hvertfall sha1 eller sikrere. For å sikre passordet mot rainbow tables er det vanlig å hashe inn et salt sammen med passordet. F. eks

Kode

<?php
$salt = genSalt(); // Tilfeldig string
$password = sha1($salt . $password . $salt);
?>
Om du bruker denne metoden må du også lagre saltet i databasen, ellers blir det umulig å logge inn for brukeren.

Det vil heller ikke hjelpe å generere en hash flere ganger. Det vil bli like enkelt å bruteforce fordi brukerens passord er fremdeles det samme, det er bare hashen som forandres.

[COLOR="Red"]Edit: Litt for treg![/COLOR]
Sist endret av ma10as; 9. juni 2009 kl. 15:35.
Enn hvis du kjører det med MD5 først og SHA1 etterpå?

Har ikke sett så mye på sikkerhet og hasher i php før, så prøver å lære noe nå
Skal lage meg et brukersystem, så må vite hva som er sikkert Tenkte ikke å begynne med SSL enda.
Sist endret av jeppfi; 9. juni 2009 kl. 15:39.
Med tanke på bruteforce og rainbow tables har det lite å si om du har flere hasher eller ikke. Gå ut ifra denne koden:

Kode

<?php
$salt = 'SaLt123';
$password = sha1(md5($salt . $_POST['password']));

// Valider login
$query = sprintf("SELECT [...] FROM [...] WHERE `password` = '%s'", $password);
?>
Passordet blir definert med $_POST['password'], så antall hasher har absolutt ingen ting å si. Treffer du riktig passord vil du bli logget inn uansett.

Om databasen skulle komme på avveie slik at en inntrenger sitter med alle passordene, så er det mulig du gjør jobben vanskligere for h*n om du har benyttet mange stadier med hashing. Jeg er ikke helt sikker her, men hashen må nok bruteforces for hver level med hash du har brukt. Når det er sagt er jeg sikker på at jeg har lest på et annet forum at det er totalt unødvendig å bruke flere hasher fordi det ikke gjør passordet sikrere, men klarer ikke å finne igjen innlegget nå. Mulig det er noen andre her som kan forklare dette bedre enn meg.
Sitat av ma10as Vis innlegg
md5 er knekt for lenge siden
Vis hele sitatet...
Jøssda, kan du poste algoritmen for å dekryptere md5?
Sist endret av Goophy; 9. juni 2009 kl. 16:21.
m0b
m0b's Avatar
DonorAdministrator
ma10as: Slik jeg vil vurdere det, har ikke md5 en risiko med mindre angriperen på forhånd allerede vet hva hashen er. Dersom dette er ukjent for angriperen, vil det bli en generering av tilfeldige verdier for å framskaffe en korrekt hash. Skulle hashen som ligger i databasen tilfeldigvis ha kollisjoner så vil det være større sannsynlighet for at han kommer fram til en hash som tilsvarer det som er den hashede strengen av passordet. Sannsynligheten er fortsatt meget liten.

Sikkerhetsrisikoen kommer først fram i bildet når angriper på forhånd vet om hashen som ligger i databasen, og kan dermed kunne potensielt kalkulere seg fram til en kollisjon eller godkjent passord.
Sist endret av m0b; 9. juni 2009 kl. 16:26.
Sitat av Goophy Vis innlegg
Jøssda, kan du poste algoritmen for å dekryptere md5?
Vis hele sitatet...
Er dette godt nok?
Sitat av ymgve Vis innlegg
Vis hele sitatet...
Så det enkelte mener er at md5 er "knukket" ved at det er mulig å brute-force seg frem til to like hasher?
Ja. Når søkerommet er redusert nok til at bruteforcing er mulig over maks noen dager så er algoritmen praktisk talt knukket. Ikke at det har så mye å si for hjemmesnekra PHP-autentisering i praksis, men "sha1()" er bare en bokstav mer enn "md5()", så hvorfor ikke bruke det istedet.
m0b
m0b's Avatar
DonorAdministrator
SHA1 har også potensielle collisions, bare så det er sagt.
Sist endret av m0b; 9. juni 2009 kl. 16:35.
Og er du ekstremt, ekstremt paranoid har du http://no2.php.net/manual/en/function.hash.php - sha512 burde holde en liten stund ihvertfall.
m0b
m0b's Avatar
DonorAdministrator
Ja. Poenget mitt er i alle fall at man trenger ikke legge så altfor mye ressurser i nøyaktig hvilken type hash-metode som benyttes. Sett av ressursene på rett plass, og heller ha fokus på at ikke uvedkommende skal få tak i databasen og lese av hashene. Det kan være interessant å drøfte sikkerhetsaspektene på slkt, men det har generelt veldig lite for seg på vanlige system laget av hobbyprogrammerere. Sikkerhet er så veldig mye mer enn å tenke på algoritmen.

Der md5-hash kollisjoner kommer til sitt rette er vel gjerne uansett modifisering og laging av ondsinnede executables som har samme hash som den originale filen. Se for deg hash sjekking innad i et domene, nedlasting av filer og ikke minst genererte SSL sertifikat som kan benytes under et mitm-angrep.
Sist endret av m0b; 9. juni 2009 kl. 16:55.
Vil det ikke også være lurt, for å hindre BF, at man legger inn at man max kan ha X antall forsøk før man blir ip-banned (o.l) i XX antall minutter?
det har ingenting å si, da man bruteforcer offline etter at man har fått tak i MD5 hashen!
Sist endret av VivaLatrina; 9. juni 2009 kl. 18:42.
Sitat av VivaLatrina Vis innlegg
det har ingenting å si, da man bruteforcer offline etter at man har fått tak i MD5 hashen!
Vis hele sitatet...
Såklart har det noe å si, det er som oftest mye lettere å starte et bruteforce enn å hacke en database .

Det er en grunn til at også nFF har en slik funksjon . - 5 feilede innlogginger = 15 min pause
Sist endret av lsrr; 10. juni 2009 kl. 13:59.
Queen of Blades
Jonta's Avatar
DonorCrew
Samme har jeg kommet fram til med bruteforcing. La oss si fem forsøk, så fem minutter. Deretter fem forsøk, 15 minutter, tre forsøk, 30 minutter. En simpel algoritme for å øke tidsrommet, og senke antall forsøk. Antageligvis mest hensiktsmessig til en viss grense.

Jeg antar at man kan basere antall tillatte autentiseringsforsøk på cookies også? I tillegg til IP-adresse. Og kreve statisk IP for en liten periode. Dette vil gjøre bruteforcing meget tidkrevende, men gjør antageligvis at angrepet blir ledet i en annen retning, nemlig finne passordhashene.
jeppfi's Avatar
Trådstarter
Jonta: Å bruke cookies er vel ikke det beste? Går vel an å gjøre slik at den tømmer cookies etter 5 forsøk. Sessions er vel sikrere der.
Sist endret av jeppfi; 10. juni 2009 kl. 18:12.
Er det vits å hashe en verdi flere ganger?

Tenk følgende kode:

Kode

$a = sha1('en-verdi-f.eks-et-passord');
Og følgende kode:

Kode

$a = sha1(sha1(md5(sha1(crypt(sha1(md5('en-verdi-f.eks-et-passord')))))));
Mange vil påstå at sistnevnte er den sikreste. Det virker logisk, men resultatet er et ca. like stort tall uansett. Uansett hva som som blir "hashet", får man et tall innen en bestemt range, 128bit for md5 og 160bit for sha1. Det er minst like stor sjanse for at man ved en brute-force treffer på en annen verdi, som gir samme hash, enn den opprinnelige hashen. En annen verdi med samme hash vil gjøre akkurat samme nytten som den egentlige verdien, ettersom begge vil gi samme resultat.

Med andre ord: Begge kodene er omtrent like sikker. Tilfeldigheter i den bestemte sammenhengen vil avgjøre hvilken som er sikrest.
Sist endret av Exmagician; 10. juni 2009 kl. 18:22.
Queen of Blades
Jonta's Avatar
DonorCrew
Sitat av Janpfo Vis innlegg
Jonta: Å bruke cookies er vel ikke det beste? Går vel an å gjøre slik at den tømmer cookies etter 5 forsøk. Sessions er vel sikrere der.
Vis hele sitatet...
Mente dette som et tillegg til IP. Spørs vel hvilken sessiontype man bruker også. Session cookies som eksempel, men skal ikke skryte på meg nok kunnskap om emnet.
m0b
m0b's Avatar
DonorAdministrator
Sitat av loathsome Vis innlegg
Er det vits å hashe en verdi flere ganger?

Tenk følgende kode:

Kode

$a = sha1('en-verdi-f.eks-et-passord');
Og følgende kode:

Kode

$a = sha1(sha1(md5(sha1(crypt(sha1(md5('en-verdi-f.eks-et-passord')))))));
Mange vil påstå at sistnevnte er den sikreste. Det virker logisk, men resultatet er et ca. like stort tall uansett. Uansett hva som som blir "hashet", får man et tall innen en bestemt range, 128bit for md5 og 160bit for sha1. Det er minst like stor sjanse for at man ved en brute-force treffer på en annen verdi, som gir samme hash, enn den opprinnelige hashen. En annen verdi med samme hash vil gjøre akkurat samme nytten som den egentlige verdien, ettersom begge vil gi samme resultat.

Med andre ord: Begge kodene er omtrent like sikker. Tilfeldigheter i den bestemte sammenhengen vil avgjøre hvilken som er sikrest.
Vis hele sitatet...
Vel, la meg snu på vinklingen litt da. Med at du f.eks omså kjører md5(md5('a')) sikrer du at i ytterste ledd er input-strengen minst 32 bytes. Gjør du ikke det og kjører kun md5('a') som tilsvarer 1 byte. Når du bruteforcer er det gjerne ikke bare tilfeldigheter, du begynner ikke med å bruteforce systematisk på 32 bytes lange passord men på 1. Hvilke av disse tror du tar kortest tid å komme seg fram til?

Edit: Det forutsetter selvfølgelig at angriper ikke vet om den "formelen".
Sist endret av m0b; 10. juni 2009 kl. 20:44.
jeppfi's Avatar
Trådstarter
Så hvis du hasher passordet i både SHA1 og MD5 så skal det være ganske trygt?
Queen of Blades
Jonta's Avatar
DonorCrew
Sitat av Janpfo Vis innlegg
Så hvis du hasher passordet i både SHA1 og MD5 så skal det være ganske trygt?
Vis hele sitatet...
Bør vel det. Men salt er viktig.
jeppfi's Avatar
Trådstarter
Ja, hvis du hasher passordet sammen med saltet i SHA1 og MD5 så skal det være trygt nok?
Sikkerhetsklarert
En liten avsporing her, men siden det er mange her som tydeligvis kan en del om kryptering så skyter je ut følgende spørsmål.

hvorfor er ikke md5 reverserbart ? Jeg antar at "formelen" for å kyptere med md5 er allment kjent siden det er bred støtte for denne krypteringen.

Og når man så vet hva som skal til for å lage en slik hash, hvorfor ikke bare reversere regnestykket? (vet at det sikkert er veldig godt svar på det, ellers så ville jo ikke md5 vært like "sikkert" fortsatt)
Tastaturkriger
Deezire's Avatar
Fordi MD5 ikke er kryptering.
Sikkerhetsklarert
Sitat av Deezire Vis innlegg
Fordi MD5 ikke er kryptering.
Vis hele sitatet...
Ok, så jeg ordla meg feil. Spørsmålet mitt gjelder fortsatt.

Eller.. Når jeg tenker meg om så lar det seg vel ikke gjøre å reverse dette av den enkle grunn at man ikke vet lengden på input strengen. md5("a") gir like lang hash som md5("abcdefghijklmnopqrstuvwxyzæøå")
Trenger ikke kunne noe krypto for å svare på det
Dette går heller under grunnleggende funksjonslære. Hvis vi har en funksjon f(x)=y så kan vi bare finne en invers funksjon f^-1(y)=x dersom f(x) er injektiv (en-til-en).

Hash-funksjoner er mange-til-en, og det finnes derfor ingen invers til disse. Kort sagt: ikke alle regnestykker kan reversers
Sitat av Pjukern Vis innlegg
Når jeg tenker meg om så lar det seg vel ikke gjøre å reverse dette av den enkle grunn at man ikke vet lengden på input strengen. md5("a") gir like lang hash som md5("abcdefghijklmnopqrstuvwxyzæøå")
Vis hele sitatet...
En kan ikke reversere MD5 hasher. En kan lage hash av a,b,c,d,e.. og så sjekke om hashene som produseres matcher den som er hash av noe hemmelig. Alle hash-algoritmer har som regel egenskapen at endrer du 1 bit i det som blir hashet skal minst 50% av output hashen bli endret.

Siden tråden har "paranoid" i tittel så kan jeg jo legge med noen tanker som nok for mange havner i "overkill" kategorien..

Når det gjelder å hashe passordet flere ganger (md5(sha1(md6(sha2($secret)))) (i tillegg til et salt selvfølgelig) så gir dette faktisk mer sikkerhet. Grunnen er så enkel at det tar lengre tid for en PC å utføre operasjonen, og dermed vil det å lagre en rainbowtable (forutsatt at du også har saltet) vil ta et visst ekstra CPUsykluser per hash. "Angrepet" med at du hasher "hei" kun med md5 og håper på å treffe samme hash som md5(sha1(md6(sha2("hei"))) er så og si ikke eksisterende.

I tillegg til hashing av passord må riktig feilhåndtering og forsvar mot timingangrep være på plass i ett paranoid login-system.

Her er et godt eksempel på hvordan login systemer burde være skrevet (hasher passordet + salt 1000 ganger med SHA1 uansett om brukeren finnes eller ikke)
http://www.owasp.org/index.php/Hashing_Java
Sist endret av KozmiC; 10. juni 2009 kl. 23:18.
Tastaturkriger
Deezire's Avatar
Jeg skjønner ikke helt tankegangen til folk. Du kan lage så mange hasher ut av passordet og du vil uansett være like utsatt for et brute-force angrep. Sikkerheten må ha sviktet i ganske mange ledd før databasen din er på avveie og noen faktisk sitter på alle hashene. Det finnes ganske enkelt mange andre steder hvor du bør legge inn tid og krefter på å gjøre det sikkert.
Har man tilgang til databasen, er det jo forsåvidt bare å legge inn sin egen bruker + kjent hash med de rettighetene man ønsker.

PHP er også et språk som er lett å lære, men mange utviklere tar ikke sikkerheten på alvor (les: liten/ingen kunnskap om emnet) og det er dermed duket for sql injection og andre godsaker :-)
Må meg nesten si meg enig med Deezire her.. BF vil nok være mer aktuelt å stoppe på brukersiden, enn DB siden.
Har en person kommet seg inn i DB'n så er det meste kjørt uansett.

Nå vil jo dette variere litt på hvilket brukersystem det er snakk om ifra TS... Men uansett så er det jo snakk om en passord-login, og da må man jo uansett skrive ett passord inn.. og ikke en hash verdi av passordet...

Er passordet 123, så skriver man jo inn 123 i innloggingsfeltet, og ikke hash-verdien av passordet.

Så vil nok være mer sikkert å satse på en god BF sperre som regger IP og evt kjeks, og så gir pause på 15-30 min etter 5-6 misslykket forsøk. Istedet for å hashe passordet til man blir grønn i ansiktet...
Gitt riktig hardware/software er det null stress å kjøre md5(md5(md5(...))) eller lignende digest-algoritmer uten å tape for mye tid på dette (i alle fall ikke til den grad at det blir et hinder). Hvis man vet saltet og vet "formelen" så er fortsatt passordet det svakeste leddet, og man kan bruteforce lette/korte passord innen rimelig tid. Det eneste man oppnår er at tidligere pre-gerenerte tabeller blir ubrukelige og må i så fall genereres ad-hoc på en "per bruker"-basis hvis hver bruker har et unikt salt. En god idé er derfor å sette en streng passordpolicy, og som andre har nevnt, sikre databasen fra starten av.

IPB (nFF) bruker for øvrig md5(md5($pass)+md5($salt))
Sist endret av Dyret; 11. juni 2009 kl. 03:51.
▼ ... over en uke senere ... ▼
Limited edition
Moff's Avatar
I bunn og grunn tror jeg ikke det er mulig å sikre seg 100% mot angrep. Det skal godt gjøres å bygge et system som er så sikkert at det ikke kan knekkes. Som Dyret er inne på så vil passordet, eller nærmere bestemt brukeren selv, være det svakeste leddet. Om du har satt opp et uknekkelig innloggingssystem som hasher og krypterer og verifiserer i alle retninger, så hjelper det svært lite om en bruker registrerer seg med passordet "a".

Nå har jeg kludret litt med dette her selv, og har kommet frem til at man egentlig bare må gjøre det man kan og sikre sin egen konto best mulig, så får man ta seg av slike angrep når de kommer (ved å lagre backuper og skifte passord jevnlig). For å beskytte databasen din bør du i det minste ha et skikkelig ulogisk passord av typen du ikke går rundt å husker. Bruk gjerne alle tre typer tegn (a-z A-Z 0-9 !-~) for å gjøre det vanskeligst mulig å gjette. Det er forresten også noe av grunnen til at noen nettsider tvinger det til å ha både tall og bokstaver i passordet.

Men om vi først skal lage noe som er ganske "sikkert" i PHP (fra serveren sin side, altså), så tenkte jeg på dette:
Bruke et innloggingsskjema med brukernavn og to eller flere passord (til samme konto). Passordene kan du hashe så mange ganger som du har tid til med flere saltst(r)enger. Hvert innlogginsforsøk som går i dass noteres med timestamp i databasen, slik at du kun har x antall forsøk uansett IP, sessions eller cookies. Som en bonus kan man notere IP-adressene som brukes også, slik at disse kan sjekkes eller sperres og sånt. Også må brukeren også svare på en CAPTCHA hver gang. Dette ville tatt rimelig lang tid og vært utrolig plagsomt, selvsagt. Hvis du er laget av gryn så kan du jo også legge inn en SMS-tjeneste, hvor du må taste inn en engangskode fra mobilen din ved innlogging. Ikke ulikt Bank-ID-systemet.