Ik ben de laatste tijd bezig met een eigen projectje waarbij ik OOP PHP probeer te leren. Maar nu kom ik dus tegen het volgende probleempje aan. Ik ben nog niet erg bekend met het beveiligen van wachtwoorden (Alleen MD5 ben ik bekend mee, maar dat is achterhaald heb ik begrepen (iig zonder salt)). Mijn vraag is dus: welke manier kan ik het beste gebruiken om mijn wachtwoorden op te slaan?
ik heb op het forum al verschillende technieken langs zien komen, zoals:
Sha1 + salt
crypt methode
en de bcrypt class (wat mij wel een goede oplossing lijkt vanwege het automatisch Salten, en het vertragen van brute force aanvallen).
Mijn 2de vraag is eigenlijk het volgende.
als ik een wachtwoord op welk van de bovenstaande manieren beveilig, welke manier kan ik dan het beste gebruiken om de input van het inlogformulier te vergelijken met de data in de database? dit omdat Salt random is.
John, die van 10 tekens is een stuk sneller (hoewel 't mij niet gaat om 't kratje bier ;-)). Zet 'm maar neer, als jij verteld met welke karakters het precies is zal ik 'm proberen te bruteforcen.
Edit; als toevoeging op wat je net zei. Zolang het lang genoeg is, is het inderdaad aan de veilige kant. Er zijn echter een hoop ontwikkelaars die het wachtwoord van 10 karakters gewoon in MD5 zetten en hopen dat het veilig genoeg is. En dát is het probleem, dat is niet veilig genoeg!
Toevoeging op 20/08/2012 02:13:45:
Hm. Resultaten zijn niet zoals gewenst, heb m'n krachtigere pc nu niet bij de hand. Haalde om en nabij de 1085 hashes per seconde, maar kan sneller. Zal 'm voor ffies laten draaien. Échte start (had wat hickups) van de bruteforce, 02:08. Sleep tight!
Ik zal het nog eens voorrekenen:
Stel je krijgt e.e.a. nog opgevoerd, en je kunt op 10.000 hashes per seconde komen (factor 10 sneller dus) en je weet dat de plaintext alleen uit hoofd- en kleine letters bestaat dan kun je uitrekenen hoelang het duurt om alle hashes te berekenen:
Gemiddeld vind je de oplossing na 50% van de tijd hetgeen neerkomt op 667 dagen oftewel ongeveer 2 jaar. Als je pech hebt worden het 4 jaar.
Onderstaande hash van 10 chars ascii vind je gemiddeld na 504 miljoen jaar, moet je wel e.e.a. opgevoerd krijgen tot 10.000 hashes per seconden anders worden het 5040 miljoen jaar.
Maar goed, hier een hash van 10 chars, ascii characterset (dus tussen #32 en #255):
3ff1e4fc0e461f432fcadfe5a640a5fd
En hier een hash van slechts 4 tekens, met UTF-8 characterset:
98c3fb05726ecc2c96153ec6e4bf2895
2 kratjes bier voor wie de plaintext weet te vinden.
n.b. Als je echt paranoia bent gebruik je dit om je passwords op te slaan, dan is het ECHT helemaal klaar:
een MD5 over een MD5? Waarom raad je dat aan? Heeft weinig nut.
Noem het maar weinig nut!! Eerst moet je de hash ontcijferen en krijg je een nieuwe hash, waarvan je nooit zult weten of je de juiste hebt. Je kunt d.m.v. brute force dus wel alle sleutels terugrekenen, maar je weet nooit of je hem daadwerkelijk gevonden hebt. En als je denkt hem gevonden te hebben, moet je daarna de plaintext proberen te vinden.
In beginsel kwadrateert hierdoor de oplos tijd, 5000 miljoen jaar wordt ineens 25.000.000 miljoen jaar ;-)
Praktijk voorbeeld: Je PIN code staat op je bankpas d.m.v. DES encryptie. Bij DES is de sleutel lengte maar 56 bits, en op een gegeven moment is besloten om DES te vervangen door Triple DES. Dus DES(DES(DES())) En daarmee was het probleem weer uit de wereld.
[quote="Chris NVT op 20/08/2012 09:45:23"]
een MD5 over een MD5? Waarom raad je dat aan? Heeft weinig nut.
Noem het maar weinig nut!! Eerst moet je de hash ontcijferen en krijg je een nieuwe hash, waarvan je nooit zult weten of je de juiste hebt. Je kunt d.m.v. brute force dus wel alle sleutels terugrekenen, maar je weet nooit of je hem daadwerkelijk gevonden hebt. En als je denkt hem gevonden te hebben, moet je daarna de plaintext proberen te vinden.
In beginsel kwadrateert hierdoor de oplos tijd, 5000 miljoen jaar wordt ineens 25.000.000 miljoen jaar ;-)
Praktijk voorbeeld: Je PIN code staat op je bankpas d.m.v. DES encryptie. Bij DES is de sleutel lengte maar 56 bits, en op een gegeven moment is besloten om DES te vervangen door Triple DES. Dus DES(DES(DES())) En daarmee was het probleem weer uit de wereld.
[/quote]
MD5 is verouderd en heeft zeer uitgebreide bruteforce databases. Wat Aar al zegt, de kans op collision met dubbele hashes wordt zo stukken groter. Gebruik gewoon SHA() met salt en peper of ga eens kijken naar crypt();
Ik raad zoiezo niet aan om MD5(); te gebruiken voor wachtwoorden, en zeker niet 2x een MD5 hash, kijk naar betere altenatieven.
Toevoeging op 20/08/2012 10:10:11:
John Berg op 20/08/2012 10:08:25
[quote="- Aar - op 20/08/2012 10:04:15"]
Plus dat je meer kans hebt op collissions als je vaker md5() gebruikt, bovenop elkaar.
Ik denk dat de kans om als je op straat loopt door een meteoriet "from outher space" geraakt te worden groter is.
[/quote]
Dat denk ik niet, je kunt binnen 10 minuten een MD5 hash achterhalen met de juiste database.
Ik zal het erbij laten, ik heb het nu 3x voorgerekend van diverse kanten. Als je het nu nog niet snapt is er weinig hoop.
Wat er bij niet in kan is dat er van alles geroepen wordt, zonder onderbouwing.
Ik heb 3 hashes gepost, en als het dan zo onveilig is, waarom krijgt niemand dat dan even opgelost? De laatste hash was maar 4 tekens (utf-8)!
'Weinig hoop' Dat is wel een arrogante houding niet? Voordat je zulke uitlatingen doet moet je misschien eerst maar eens Google gebruiken en kijken waarom MD5 niet meer aan te raden is voor wachtwoorden.
Het gaat hier niet over goed of niet goed, het gaat hier om wat veiliger is, en dat is MD5 niet. Nogmaals zoals ik in mijn eerdere post al zij, kijk eens naar sha() met een salt en pepper of naar crypt().
Het gaat hier niet over goed of niet goed, het gaat hier om wat veiliger is, en dat is MD5 niet. Nogmaals zoals ik in mijn eerdere post al zij, kijk eens naar sha() met een salt en pepper of naar crypt().