Hi,

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.

Jan
Again, ik snap wat je bedoelt maar het kan dus ook geen kwaad om gewoon een fatsoenlijke hashing-methode te gebruiken ipv md5. Daar ging het eigenlijk over. Dat je daarnaast ook anderen dingen moet doen is een feit.
Pfffff, wat mis ik dan volgens jou?

[size=xsmall]Toevoeging op 02/03/2019 00:29:40:[/size]

en toen bleef het stil ... jammer hoor
Volgens mij zitten jullie in een theoretische discussie verwikkeld die echt werkelijk nergens meer op slaat. (lief bedoeld he) Zo vluchtig het topic gelezen, maar ik zie dingen "wat als" iemand de database heeft gevonden. Dan zou het toch heel logisch zijn dat men toch niet meer met hashing bezig is?
Immers zit het probleem van kraken van wachtwoorden niet meer in de weg, je bent al binnen.

Wachtwoorden hashen is enkel een onderdeel van iets wat kwaadwillende tegenhoud niets meer of minder.
Er moet nog altijd in het systeem een match zijn tussen iets uniek leesbaars en dat gehashte (geen idee of ik het goed schrijf) wachtwoord. Als daar een match is dan mag je pas verder. Je doet totaal niets meer met een wachtwoord. Als ik dan de keuze heb om strategisch te kiezen hoe ik mijn systeem ga inrichten dan word het toch meer de rompslomp er omheen dan enkel en alleen naar het wachtwoord en hashing kijken. :)
@Bart V B

De discussie was kort samengevat verzand in de vraag of je beter MD5 of een nieuwere hashing-methode kunt gebruiken. Thomas geeft de voorkeur aan MD5. Ikzelf gebruik liever password_hash met bcrypt.
> Thomas geeft de voorkeur aan MD5.
Ik kan zien dat je helemaal niets hebt meegekregen van wat ik probeerde over te brengen. Ook fijn dat je andere mensen woorden in de mond legt. En leuke poging om weer een reactie los te krijgen, al is het op een onderhandse manier.
@Thomas

Laten we dan op z'n minst zeggen dat jij een pleidooi houdt lijkt te houden dat de gekozen hashing-methode niet relevant is en dat MD5 prima werkt.

Vat ik het zo dan wat beter/genuanceerder samen? Kun je je hier wel in vinden?

Wellicht moet ik de vraag nog wat anders stellen. Als je zelf programmeert, gebruik je dan MD5 als hashing-methode, of iets anders zoals bijvoorbeeld password_hash?
Volgens mij draait de discussie een beetje rond twee situaties:

1) De aanvaller heeft geen directe toegang tot de database:
- Een wachtwoord achterhalen is nu alleen mogelijk door het te proberen. Dit kan systematisch ("a", "aa", enz - veel mogelijkheden), maar zal meestal aan de hand van een lijst met "bekende wachtwoorden" gebeuren ("woordenboek" - dit zijn er meestal maar "een paar miljoen").
- Het is aan de programmeur om hiertegen bescherming in te bouwen = een rem op een aantal pogingen per tijdseenheid per account, per IP-adres, enz. Dus bijvoorbeeld na 3x foutief even een paar minuten geen toegang. Voor een gewone gebruiker niet geheel overkomelijk, maar als je er een paar miljoen wilt proberen duurt het opeens veels te lang.
- De gebruiker kan zich hier tegen beschermen door gewoon een "niet standaard wachtwoord" te nemen (gewoon zo'n random gegenereerd geval, bijvoorbeeld via een wachtwoordmanager).
-> In dit geval maakt de gebruikte hashing methode geen enkel verschil tussen het wel of niet succesvol kunnen achterhalen van een wachtwoord. Je zou zelfs de wachtwoorden in plain-text op kunnen slaan. Het enige verschil wordt gemaakt door de programmeur en de gebruiker.

2) De aanvaller heeft wel direct toegang (of een kopie):
- Sowieso heb je nu een probleem, omdat er meestal wel meer data in die database stond, en die ligt nu ook allemaal op straat. Het is echter wel fijn als de wachtwoorden onbekend blijven, want dat voorkomt dat de aanvallers met de complete accountgegevens deze op andere sites kunnen gaan proberen ("Credential stuffing" - voor gebruikers die geen uniek wachtwoord hebben gebruikt), waar misschien nog veel meer is te halen.
- Een "bekend" wachtwoord, dat met MD5 is gehashed (zonder zout) is hierbij vrij eenvoudig te "decrypten" door het in een rainbow table op te zoeken.
- Een "bekend" wachtwoord dat met MD5 is gehashed, maar met een flinke portie zout, of elke andere "sterke" hashing methoden (zoals password_hash() gebruikt - gratis en voor niets met ingebouwd zout) zal alleen achterhaald kunnen worden door per hash alle bekende wachtwoorden te proberen (password_verify()). In plaats van een enkele opzoekactie moet je dus die "paar miljoen" wachtwoorden uit het woordenboek proberen. Als het zout per wachtwoord verschilt zul je ook nog per wachtwoord al die miljoenen wachtwoorden moeten proberen (als het zout vast is zou je eerst nog je eigen rainbow table kunnen maken). Dat is veel meer werk (rekenintensief), en kost dus veel meer tijd/inspanning/resources.
- Een "random" wachtwoord is in alle gevallen (MD5 met/zonder hash, of welke hashing dan ook) "niet te achterhalen".

Dus als de aanvaller toegang heeft tot je volledige database:
- Heb je sowieso een probleem.
- Maar je kunt het probleem voor je gebruikers (die wachtwoorden hergebruiken) beperken door de wachtwoorden goed te hashen. Enkel MD5 is hierbij geen serieuze oplossing ivm de vele beschikbare rainbow tables (maar dat geldt ook voor diverse andere hashing algoritmes, ook daar zijn rainbow tables voor). Je zult in alle gevallen zout toe moeten voegen, en evt. andere zelf gemaakte "hocus pocus" - als hetzelfde wachtwoord maar niet steeds dezelfde hash oplevert (voor verschillende gebruikers). De ingebouwde password_hash()+password_verfiy() functies doen dit allemaal voor je, zonder dat je er echt hard bij na hoeft te denken.
- Een gebruiker kan z'n probleem ten alle tijde beperken door "random", en unieke wachtwoorden per account te kiezen. Dat blijkt in de praktijk voor veel mensen lastig te zijn, maar wij als programmeurs kunnen ze daarbij helpen door minimale eisen aan een wachtwoord te stellen, en te controleren of ze geen gebruik maken van een "bekend wachtwoord" (bijvoorbeeld via haveibeenpwned.com).
-> Daarnaast moeten we natuurlijk in eerste instantie voorkomen dat de hele database op straat komt te liggen (algemene beveiliging van de database zelf, SQL-injectie, enz - nog meer dan genoeg mogelijkheden om een steekje te laten vallen).
Nee, Thomas stelt niet voor dat md5() ideaal is. Hij stelt dat het geen ruk uitmaakt of je nu md5 of password_hash() gebuikt met een zwak wachtwoord je in beide gevallen een makkelijke prooi bent voor een bibliotheek met wachtwoorden als je die er op los laat.

Of ik nu het wachtwoord md5('welkom') heb of password_hash('welkom') maakt in feite echt niets uit.
Het is en blijft een zwak wachtwoord.
Ja, dan heb je gelijk dat als je sec in de database kijkt je makkelijker aan de md5() kunt herleiden dat "welkom" een bepaalde string oplevert.

Maar als ik weet dat je welkom gebruikt als wachtwoord is het net zo makkelijk te herleiden in password_hash(). Dat je daar iets meer moeite voor moet doen omdat password_hash() iets random oplevert heeft niets te maken met beter of slechter. Feit blijft dat het een zwakke schakel is.

En dat is precies wat Thomas hier aangeeft. Meer is het niet.

En dat maakt deze discussie meteen zinloos.
Je kunt niet stellen ik hash mijn wachtwoord op een bepaalde manier en dan is het veilig.
Dat doe je met het hele feest er omheen, en niet dat ene onderdeel wat je wachtwoord is.

Waarom zou je anders een nieuwere optie uitvinden om juist dat te voorkomen?
Vroeger hadden we zoiets als:


SELECT * FROM users WHERE username = 'bart' AND password = md5('welkom')

Dat leverde gewoon een match op klaar we konden verder.

Tegenwoordig moet je nog een hele berg code met if-jes eromheen bouwen om te kijken met password_verify() eventueel een update query om password_needs_rehash() te doen. En dat allemaal om het veiliger te maken.
Dat is toch puur sec gedaan om programmeurs verder na te denken over hoe een login systeem in elkaar zou moeten zitten.

Maar feit blijft dat als je gebruiker een zwak wachtwoord heeft dan blijft het een zwakke schakel.
Dan maakt de manier van hashing totaal niets uit.

EDIT
Rob heeft zo ongeveer de zelfde strekking zoals ik het zie :)
Maar die was me voor.

Reageren