Door burne101: Om Bitwiper's reactie iets uit te diepen: md5 is theoretisch zwak genoeg om een 'birthday attack' mogelijk te maken.
Als ik het goed begrijp gaat het bij een "birthday attack" om de kans dat
twee willekeurige personen in een groep mensen (zoals een schoolklas) op dezelfde dag jarig zijn. De grafiek in
https://en.wikipedia.org/wiki/Birthday_problem laat zien dat in een groep van 23 personen de kans ca. 50% is dat 2 personen op dezelfde dag jarig zijn.
Echter, uitgaande van een
specifiek persoon (bijv. jijzelf of de docent) is de kans aanzienlijk kleiner dat er nog minstens 1 ander persoon op dezelfde dag verjaart. Volgens
https://en.wikipedia.org/wiki/Birthday_problem#Same_birthday_as_you is die kans, bij 23 willekeurige personen, 6,1%. Maar ook
deze "aanval" ("second-preimage attack" a.k.a. "weak collision attack") heeft niets met het reversen van wachtwoordhashes te maken.
De aanvaller probeert dan niet eens meer om jouw wachtwoord te achterhalen, hij verzint een ander wachtwoord wat een gelijke md5-hash oplevert en logt daar mee in. De lengte of complexiteit van je wachtwoord is daarmee irrelevant geworden.
Dat klopt,
elke karakterreeks die dezelfde hash oplevert is bruikbaar als wachtwoord.
Dit is vergelijkbaar met een Excel workbook dat met het wachtwoord "geheim" is beveiligd. Als je daar een password cracking macro (zoals deze:
http://jsbi.blogspot.nl/2008/09/how-to-easily-unprotectremove-password.html) op loslaat, krijg je na enkele minuten een wachtwoord als "AAABBAAABBO" dat als volwaardig equivalent werkt. Hetzelfde gebeurt als je i.p.v. "geheim" een wachtwoord met een entropie van 260 bits had gekozen (dat helpt dus geen zier bij Excel).
Maar het "reversen" van een MD5 hash naar een maakt-niet-uit-wat-voor-wachtwoord is, integenstelling tot een Excel wachtwoord, nog steeds computationally unfeasible (ondoenlijk). Het gaat hierbij om de
Preimage resistance (zie
http://en.wikipedia.org/wiki/Cryptographic_hash_function#Properties). Dus ja, elk wachtwoord dat de gegeven MD5 hash oplevert is even goed als het oiginele wachtwoord, maar het vinden van het originele wachtwoord of equivalent is in theorie nauwelijks uitvoerbaar.
Het risico zit hem voor bijna 100% in in het feit dat mensen te eenvoudige wachtwoorden gebruiken, deze op meerdere sites hergebruiken en dat ook andere mensen diezelfde wachtwoorden gebruiken. Hier spelen de zogenaamde rainbow tables op in. Omdat in rainbow tables voornamelijk
korte wachtwoorden zitten, is de kans extreem klein dat je in zo'n rainbow table een
equivalent van jouw wachtwoord vindt dat dezelfde hash oplevert
Gemiddeld moet je 2^64 random strings hashen om een collision te vinden.
Ja,
een collision (willekeurige dus), maar de kans dat dit toevallig een collision is
met de gegeven hash is verwaarloosbaar klein. Als ik de
preimage attacks op MD5 niet meeneem, zou je volgens mij gemiddeld 2^(128-1) brute-force pogingen moeten doen om een willekeurige karakterreeks (die best identiek zou kunnen zijn aan het oorspronkelijke wachtwoord) te vinden die toevallig dezelfde hash oplevert.
Concluderend is MD5 in theorie nauwelijks slechter dan bijv. SHA1 of SHA-2. In de praktijk wel, omdat er al relatief veel rainbow tables bestaan voor MD5 en nog weinig voor SHA1/SHA-2. Maar dat is natuurlijk een kwestie van tijd en dus een onverstandige gok (het is simpel om alle bestaande wachtwoorden in MD5 rainbow tables in SHA1 of SHA-2 om te zetten).
Ik ben een langer stuk over het wel en wee van MD5 gehashte wachtwoorden aan het schrijven maar dat is nog niet af. Zodra dat af is en ik het gepost heb (in een nieuwe thread) zal ik onderaan deze bijdrage een verwijzing naar die thread opnemen.