Welk paswoord systeem kiezen / veranderen
Pagina: « vorige 1 2 3 4 volgende »
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.
Gewijzigd op 28/02/2019 22:40:30 door Thomas van den Heuvel
Hmmm, ja ... je hebt vast wel eens gehoord van Rainbow tables ...
>> maar als de remmen in eerste instantie hadden gewerkt had het ongeluk mogelijk helemaal nooit plaatsgevonden.
... maar als jouw ouders geen kinderen hadden kunnen krijgen, hadden we deze discussie niet gevoerd ... als als als :D
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.
Gewijzigd op 01/03/2019 00:55:04 door Thomas van den Heuvel
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.
Ga voor de grap eens naar deze website:
https://md5decrypt.net/en/
Voer de onderstaande MD5 hash in, druk op 'Decrypt' en zie wat eruit komt.
70a31911dbc81959df10dd5725f40d71
En dat is dus wat ik bedoel met de zwakte van MD5
Gewijzigd op 01/03/2019 01:32:59 door Ozzie PHP
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>';
}
?>
// 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
Typisch geval shit in --> shit out.
Gewijzigd op 01/03/2019 02:09:19 door Thomas van den Heuvel
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.
Als je niet openstaat voor argumenten dan houdt de discussie op. Lekker MD5 blijven gebruiken dan.
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.
Gewijzigd op 01/03/2019 17:03:06 door Thomas van den Heuvel
Het ging me niet over het woord decrypt, maar om de inhoud van de hash ... het leek alsof die gericht was op hetgeen ik aanvoerde in mijn gesprek.
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.
Gewijzigd op 01/03/2019 22:07:03 door Thomas van den Heuvel
Wat klopt daar niet aan?
Ik weet echt niet hoe ik dit eenvoudiger moet uitleggen.
Gewijzigd op 01/03/2019 23:33:26 door Thomas van den Heuvel
Ja, dat klopt ... er is als het ware een heeeeel groot woordenboek met bekende hashes en de daarbij behorende vertalingen. Hoe het gevonden wordt boeit niet. Het feit is dat er heel veel wachtwoorden bekend zijn wat MD5 dus in gebruik onveiliger gemaakt in de zin van dat een wachtwoord makkelijker is te herleiden.
>> Als het bekend is hoe er gehashed wordt met password_hash() is dit even (on)veilig.
Nou nee, bij iedere generering ontstaat een andere hash. Jij en ik kunnen hetzelfde wachtwoord hebben en toch een totaal andere hash.
Je gebruikt nog steeds de oorspronkelijke wachtwoorden in de dictionary attack... en je loopt nog steeds gewoon die lijst af...
Het wordt een ander verhaal als je ook een salt gebruikt. <-- hmm maakt dit uberhaupt uit?
Gewijzigd op 01/03/2019 23:38:19 door Thomas van den Heuvel
Als je password_hash gebruikt hebben wij beiden een andere hash. Er is dus niet meer een vaste hash voor het wachtwoord "geheim" en dus kun je aan mijn of jouw hash niet zien wat het wachtwoord is.
Ja dat zeg ik dus. Je gebruikt "geheim" als password en de hash die je hebt gestolen en kijkt dan of password_verify() iets oplevert.
Bij MD5 is het:
xyz123 = geheim
Wat jij nu zegt is:
xyz123 => laten we het eens matchen met 'geheim' en kijken of daar toevallig een hit uitkomt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$password = 'welkom'; // zwak wachtwoord
$iterations = 10;
for ($i=0; $i < $iterations; $i++) {
echo password_hash($password, PASSWORD_BCRYPT).'<br>';
}
/*
$2y$10$HrPMcjHoVYsKC7GtFmfKbOS92SvIV/pcMHu/luU4frGCYkO1FQt9S
$2y$10$Auf4NqsVJqD00MA6IOHbH.PWv86sMl83457Tjo3zTyNmHFUVaKQfe
$2y$10$/tdj793VKJqHs4XdK4xeVedEyesngnyEP3oK1Wxf8Nn9xoyzQV33G
$2y$10$Yh1PWzYUajfC22G7AfrFguOmtKzWMyAje5kBb.eSABLbn7OzDRHa2
$2y$10$.hh77fACFTwiJb9ho7U32OAOgONanCEjtt3sR2Q7CBUir8CwesEJe
$2y$10$V6cop8P.5QU4ab.17u429Og6cIXO1wy11gltwdCOEKy56dpBFxPqq <--- pak deze bijvoorbeeld
$2y$10$oq.KXHnrvABH3FkiUFw.x.lCFN5BkAcPltdgKR8UhoeLqk4HDLaaO
$2y$10$DiQTJsPXoq8ZUc4mmtEE8udqTelNBYe6Ge8/.0dTWceq1BJt/6m4G
$2y$10$B5NMUBYkds3hLxORmqr/4e8rrDQOydxPoIvkYHzWWQI9gIcQH0yv6
$2y$10$hV1cvprUKExjfKOf.Yz9m.1rvmISJJNUo5bI.njdQYx68hydrBiou
*/
// Dit wordt gestolen
$stolenHash = '$2y$10$V6cop8P.5QU4ab.17u429Og6cIXO1wy11gltwdCOEKy56dpBFxPqq';
// Nou dan pakken we het woordenboek erbij...
$dictionary = array(
'geheim',
'welkom',
'lol',
);
// dictionary attack bij zwak wachtwoord werkt nog steeds hetzelfde
foreach ($dictionary as $candidate) {
echo $candidate.': ';
if (password_verify($candidate, $stolenHash)) {
echo 'pass';
} else {
echo 'fail';
}
echo '<br>';
}
/*
geheim: fail
welkom: pass
lol: fail
*/
?>
$password = 'welkom'; // zwak wachtwoord
$iterations = 10;
for ($i=0; $i < $iterations; $i++) {
echo password_hash($password, PASSWORD_BCRYPT).'<br>';
}
/*
$2y$10$HrPMcjHoVYsKC7GtFmfKbOS92SvIV/pcMHu/luU4frGCYkO1FQt9S
$2y$10$Auf4NqsVJqD00MA6IOHbH.PWv86sMl83457Tjo3zTyNmHFUVaKQfe
$2y$10$/tdj793VKJqHs4XdK4xeVedEyesngnyEP3oK1Wxf8Nn9xoyzQV33G
$2y$10$Yh1PWzYUajfC22G7AfrFguOmtKzWMyAje5kBb.eSABLbn7OzDRHa2
$2y$10$.hh77fACFTwiJb9ho7U32OAOgONanCEjtt3sR2Q7CBUir8CwesEJe
$2y$10$V6cop8P.5QU4ab.17u429Og6cIXO1wy11gltwdCOEKy56dpBFxPqq <--- pak deze bijvoorbeeld
$2y$10$oq.KXHnrvABH3FkiUFw.x.lCFN5BkAcPltdgKR8UhoeLqk4HDLaaO
$2y$10$DiQTJsPXoq8ZUc4mmtEE8udqTelNBYe6Ge8/.0dTWceq1BJt/6m4G
$2y$10$B5NMUBYkds3hLxORmqr/4e8rrDQOydxPoIvkYHzWWQI9gIcQH0yv6
$2y$10$hV1cvprUKExjfKOf.Yz9m.1rvmISJJNUo5bI.njdQYx68hydrBiou
*/
// Dit wordt gestolen
$stolenHash = '$2y$10$V6cop8P.5QU4ab.17u429Og6cIXO1wy11gltwdCOEKy56dpBFxPqq';
// Nou dan pakken we het woordenboek erbij...
$dictionary = array(
'geheim',
'welkom',
'lol',
);
// dictionary attack bij zwak wachtwoord werkt nog steeds hetzelfde
foreach ($dictionary as $candidate) {
echo $candidate.': ';
if (password_verify($candidate, $stolenHash)) {
echo 'pass';
} else {
echo 'fail';
}
echo '<br>';
}
/*
geheim: fail
welkom: pass
lol: fail
*/
?>
Dus nogmaals: je doet er verstandiger aan te investeren in een strategie die sterke wachtwoorden oplevert, want een sterkere hashing lost het probleem met zwakke wachtwoorden niet op...
Gewijzigd op 01/03/2019 23:50:19 door Thomas van den Heuvel
Laten we even doen alsof het gehashte wachtwoord een woord in een vreemde taal is. Laten we zeggen 'sojeojekre'.
Nu pak ik m'n MD5 woordenboek erbij, ga naar de letter 's' ... 'so' ... 'soj'... ah daar staat het. De vertaling (het originele wachtwoord) is 'amigo'.
Nu wil jij ook weten wat 'sojeojekre' betekent, maar jij moet nu eerst miljoenen mogelijke wachtwoorden gaan afvuren om te kijken of er misschien een match is.
Stel dat een hacker nu een database heeft onderschept met 100.000 wachtwoorden, dan moet ie in het geval van password_hash 100.000 keer miljoenen wachtwoorden gaan afschieten, terwijl ie ze met MD5 gewoon stuk voor stuk in het 'woordenboek' kan opzoeken en dan is ie met 100.000 zoekopdrachten klaar. En dan heb ik de cost factor van password_verify nog even buiten beschouwing gelaten.
Zie ook de toevoeging in de vorige reactie:
Dus nogmaals: je doet er verstandiger aan te investeren in een strategie die sterke(re) wachtwoorden oplevert, want een sterkere hashing lost het probleem met zwakke wachtwoorden niet op...
Gewijzigd op 01/03/2019 23:58:19 door Thomas van den Heuvel