Momenteel werk ik met hash('sha512', $pw) voor mijn paswoorden. Is er iets beter en is het de moeite om over te stappen bij een bestaand project.
volgens http://php.net/manual/en/function.hash.php zijn er zo veel mogelijkheden om uit te kiezen maar de sterkte is niet vermeld.
Natuurlijk is het verstanding om wachtwoorden zo goed mogelijk te hashen.
Aan de andere kant, het slecht hashen van wachtwoorden is weer alleen een probleem wanneer je altijd dezelfde wachtwoorden gebruikt, en dan ook alleen weer als op verschillende sites dezelfde algoritmes worden gebruikt.
Dus zelfs als jij MD5 gebruikt (bij wijze van spreken...), dan loopt dat misschien wel weer los, omdat heel weinig anderen dit intussen nog gebruiken, nietwaar? :))
En om voort te borduren op die metafoor: als je er vervolgens achter komt dat het ongeluk werd veroorzaakt door weigerende remmen dan is het natuurlijk extra fijn dat je die airbag had (maar wellicht span je dan nog een rechtzaak aan om kosten te verhalen), maar als de remmen in eerste instantie hadden gewerkt had het ongeluk mogelijk helemaal nooit plaatsgevonden.
>> Hmmm, ja ... je hebt vast wel eens gehoord van Rainbow tables ...
Hmmm ja, als jouw wachtwoord daar in voorkomt dan is je uitgangspunt al verre van optimaal he. Daar is geen enkel kruid tegen gewassen. Als je een bagger wachtwoord kiest maakt het niet uit wat voor geavanceerd systeem je gebruikt. Dat maakt dan elke vervolgdiscussie nogal zinloos.
>> ... maar als jouw ouders geen kinderen hadden kunnen krijgen, hadden we deze discussie niet gevoerd ... als als als :D
Waar slaat dit in hemelsnaam op? Ik probeer te wijzen op een andere punt in het systeem waarmee je onheil daadwerkelijk kunt voorkomen. Hashing voorkomt geen problemen.
En als je een match vindt door flink te rekenen levert je dat "iets" op dat werkt, maar dat is niet noodzakelijkerwijs het oorspronkelijke wachtwoord maar iets wat "toevallig" dezelfde hash heeft. Dat wachtwoord werkt dus ook niet als je daarmee probeert in te loggen bij een ander systeem (Facebook, GMail of een andere dienst), zelfs als de gedupeerde hetzelfde wachtwoord gebruikte als in het gekraakte systeem omdat het berekende wachtwoord en het daadwerkelijke wachtwoord dus waarschijnlijk niet overeen komen. De hashes daarvan komen dus ook niet overeen.
In zekere zin heeft de hashing dan al zijn doel bereikt?
Je doet nu net alsof je met 100% zekerheid het oorspronkelijke wachtwoord kunt extraheren (rainbow tables daar gelaten uiteraard - als je een prut wachtwoord kiest uit een standaard lijst van wachtwoorden...) als je een zwak hashing algoritme gebruikt en dat is simpelweg niet waar. Dit is gewoon niet mogelijk. Punt. Dit is de hele crux van hashing, tijdens de berekening hiervan gaat informatie van de brondata onherroepelijk verloren - het is een "one way system". Je kunt hoogstens iets vinden dat dezelfde hash oplevert. En dan werken dit soort collisions alleen in een ander systeem wanneer beide systemen precies dezelfde hashingstrategie gebruiken. Wat ook nogal onwaarschijnlijk is.
De hashing heeft dan dus nog steeds zijn werk gedaan, zelfs als je een zwak algoritme gebruikt, omdat het nog steeds verijdelt dat je hiermee ergens anders in kunt loggen omdat je simpelweg het oorspronkelijke wachtwoord niet kent.
Neemt ook nog steeds niet weg dat er dan hiervoor al een heleboel is misgegaan (slechte remmen enzo) op het moment dat dit een probleem gaat vormen. Airbag of niet, je auto is aan gort.
TL;DR het is nog altijd beter om te investeren op andere ("beveiligings")punten in je systeem zodat je nooit het punt bereikt dat je iets aan hashing zou hebben.
Niet helemaal waar ... veel MD5 wachtwoorden zijn letterlijk terug te herleiden naar de oorsprong. Daarom wordt MD5 afgeraden. Een "123geheim" zou bij MD5 hashing veel eenvoudiger zijn terug te vinden dan wanneer je bijv. password_hash gebruikt.
>> Waar slaat dit in hemelsnaam op? Ik probeer te wijzen op ...
Lol, ik probeer jou middels een grapje (het was een grapje Thomas, rustig blijven) erop te wijzen dat allerlei ALS ALS situaties niet hoeven in te houden dat je iets niet hoeft te doen. Jij bent van nature (afgaande op je reacties) vrij sterk geneigd om als iemand een vraag heeft er allerlei 'randvoorwaarden' bij te halen "ja maar als dit ..." "ja maar als dat ...". En begrijp me niet verkeerd, want je hebt op al die punten gelijk, maar dat wil niet zeggen dat de vragensteller niet ook gelijk kan hebben of het met jou oneens zou zijn. Dat is wat ik je (middels een grapje) probeerde duidelijk te maken. Als ik naar de frietboer ga en ik wil een gehaktbal, dan wil ik gewoon een gehaktbal en hoef ik niet (altijd) te horen wat er nog meer verkrijgbaar is en hoe gezond de sla-salade is.
<?php
// https://www.random.org/passwords/?num=5&len=8&format=html&rnd=new
$passwords = array(
'hmBUJZNw', // 31a613f8773bda977b917cbc5b34f4b9 // Sorry, this hash is not in our database
'my5EQwPy', // 148db98774323698f3331499cafb946a // Sorry, this hash is not in our database
'34SJbJpG', // 2cfc543a42ab5e9b77bd57562f75a405 // Sorry, this hash is not in our database
'BXB2KX2N', // 91ce7b1b115802dbe98da4e7c3edb844 // Sorry, this hash is not in our database
'487Tbr4J', // d4a844c706c42e8cad506555a1adb9ee // Sorry, this hash is not in our database
);
foreach ($passwords as $password) {
echo md5($password).'<br>';
}
?>
Thanks, come again.
Anders "decrypt" (<-- verkeerde terminologie zelfs) deze eens:
48c109c6c50851348f972f52f2d88d6e
Kweenie, maar deze discussie heeft voor mij een beetje het niveau van: "zal ik wel of geen pleisters meenemen op vakantie; ik ga d'r vanuit dat er niks gebeurd, maar andersom wegen ze ook niks". Dan neem je ze toch gewoon mee, hop in je rugtas en 3 jaar later vind je ze terug en denk je "o ja, die pleisters, gelukkig nooit nodig gehad".
Ja, met super intelligente gebruikers die volledige random wachtwoorden nemen (of krijgen?) is MD5() een prima optie, maar password_hash() is net zo veel werk, en redelijk fool proof. Waarom dan nog proberen te beargumenteren dat MD5 ook een optie is? Ga door met de rest van je werk (de rest van de site hacker proof maken), of lekker buiten in de zon zitten.
> Oh je gaat nu een lullige houding aannemen? Beetje jammer.
Nee, dat ("decrypt") is de terminologie die de site gebruikt waar jij naar verwijst. Het is waarschijnlijk helemaal geen decryptie (eerder aangedragen: onmogelijk bij hashing) maar gewoon een lookup-tabel waarin gekeken wordt of het wachtwoord voorkomt.
> Als je niet openstaat voor argumenten dan houdt de discussie op.
Dat is grappig, ik probeer je met al mijn vorige antwoorden een andere kant te laten zien maar die blijft jou blijkbaar bijster. Wie staat er nu niet open voor een ander inzicht dan?
> Lekker MD5 blijven gebruiken dan.
Dat stel ik nergens voor, het was meer als onorthodox voorbeeld bedoeld om wat "discussie" uit te lokken en je aan het denken te zetten. Het enige wat ik kreeg was een razende schuimbekkende menigte. Als je er over *nadenkt* is het allemaal niet eens zo krankjorum. Dat wil niet zeggen dat je dan direct ook moet doen wat er wordt voorgesteld... Dat jij nu direct getriggerd wordt als ergens "md5" wordt genoemd voor wachtwoordbeveiliging. Het vogeltje zingt zoals het gebekt is? Vervolgens gaat het verstand op nul en wordt er niet eens meer gelezen wat er wordt geschreven. Okay dan.
Het is grappig dat je het uberhaupt over "discussie" hebt want je volgt de regels die bij een discussie horen zelf geenszins.
> Ja, met super intelligente gebruikers die volledige random wachtwoorden nemen (of krijgen?) is MD5() een prima optie, maar password_hash() is net zo veel werk, en redelijk fool proof. Waarom dan nog proberen te beargumenteren dat MD5 ook een optie is?
Lees mijn vorige antwoorden nogmaals en probeer mijn redenatie te volgen. Ik zeg nergens dat je het zou moeten gebruiken, ik probeer het alleen aannemelijk te maken (met argumenten) dat het niet compleet ongeschikt is voor het beoogde doel. Of het verstandig is om dat dan ook te gebruiken is vers twee...
> Ga door met de rest van je werk (de rest van de site hacker proof maken)
Dat is eigenlijk precies wat ik voorstel. Je bent (ook) veel meer gebaat bij een sterk wachtwoord dan een sterk hashingalgoritme. Dus daar zou dan ook de nadruk moeten liggen qua tijdsinvestering.
Ik voer vijf random hashes -de eerste vijf die random.org uitspuugt- aan die site (wie zegt trouwens dat die een autoriteit is?) en geen van allen kunnen ze worden "gedecrypt". Jij daarentegen levert "bewijs" aan (zwak wachtwoord) die in dienst staat van de hypothese die je probeert te toetsen (zwakte van MD5? wat, omdat een standaard wachtwoord geïndexeerd is? wut?). Het enige wat je daarmee aantoont (of in ieder geval aannemelijk maakt) is dat een niet voor de hand liggend wachtwoord je verder helpt dan een hashingmethode.
Maar dit is zinloos. Dit is zelfs niet eens een discussie. De strekking van wat ik probeer over te brengen komt niet aan.
Maar doe voor de gein eens een gedachtenexperiment, zonder aannames of vooroordelen over md5 en vraag je zelf eens af wat voor implicaties dit nu echt heeft en wanneer deze nou echt daadwerkelijk van toepassing zijn. Want iedereen is het er over eens dat het "not done" is maar kun je ook uitleggen waarom?
EDIT: een argument is bijvoorbeeld: md5 is niet geschikt als / is geen cryptografische hashingfunctie (onder andere) omdat dit een snel algoritme is. Nergens in deze hele thread behalve de door @Remco gelinkte site en op php.net wordt dit aangehaald...
Of je gebruikt gewoon password_hash() en password_verify() en je kijkt niet verder dan je neus lang is, mij ook best.