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.
[quote="John Berg op 20/08/2012 12:56:40"]
Haha .. grapjes. Uit het linkje dat je gaf (2e regel): Some operating systems support more than one type of hash. In fact, sometimes the standard DES-based algorithm is replaced by an MD5-based algorithm.
Wat wil je hier mee zeggen? Raad ik hier ergens aan om DES of MD5 te gebruiken? crypt ondersteunt ook gewoon sha vriend.
[/quote]
Vriend .. ik raad je aan om dat wat in het linkje staat eens goed te lezen. De Crypt() functie gebruikt een algoritme dat afhankelijk is van de libraries die op het host systeem staan. Als je Crypt gebruikt weet je vooraf niet welk algoritme hij zal gebruiken, tenzij je zelf de host beheert en een algoritme dwingend oplegt!!
Lekker om iets te beveiligen waarbij je vooraf niet weet welk algoritme het systeem zal gebruiken. Het wordt vast ik zeker heel veilig wat je gaat maken.
[quote="Chris NVT op 20/08/2012 12:58:56"]
[quote="John Berg op 20/08/2012 12:56:40"]
Haha .. grapjes. Uit het linkje dat je gaf (2e regel): Some operating systems support more than one type of hash. In fact, sometimes the standard DES-based algorithm is replaced by an MD5-based algorithm.
Wat wil je hier mee zeggen? Raad ik hier ergens aan om DES of MD5 te gebruiken? crypt ondersteunt ook gewoon sha vriend.
[/quote]
Vriend .. ik raad je aan om dat wat in het linkje staat eens goed te lezen. De Crypt() functie gebruikt een algoritme dat afhankelijk is van de libraries die op het host systeem staan. Als je Crypt gebruikt weet je vooraf niet welk algoritme hij zal gebruiken, tenzij je zelf de host beheert en een algoritme dwingend oplegt!!
Lekker om iets te beveiligen waarbij je vooraf niet weet welk algoritme het systeem zal gebruiken. Het wordt vast ik zeker heel veilig wat je gaat maken.
[/quote]
=.= voordat je nu nog meer gaat roepen, kijk eens naar de eerste voorbeelden. Ik zal ze hieronder zetten voor je.
<?php
/* These salts are examples only, and should not be used verbatim in your code.
You should generate a distinct, correctly-formatted salt for each password.
*/
if (CRYPT_STD_DES == 1) {
echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n";
}
if (CRYPT_MD5 == 1) {
echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n";
}
if (CRYPT_BLOWFISH == 1) {
echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>
Zo gebruik je crypt, niemand gebruikt crypt zonder aan te geven welke methode hij wil gebruiken. Ik ga hier nu niet verder in discussie, aangezien dit niet mijn topic is.
Ik ben het er mee eens dat als je extreem ver gaat een MD5 lastiger te kraken is. Ikzelf ga de uitdaging ook niet aan, ik heb nooit beweerd dat ik het zelf kan. Ik heb echter al op 'onderwereld' forums verbazingwekkende zaken gezien.
Om op dat laatste nog even door te gaan... Je berekeningen zijn wellicht correct, ik heb ze niet gecontroleerd. Alleen voor zover ik ze bekeken heb, ga je er altijd vanuit dat een hacker maar 1 machine gebruikt. Dat is niet erg realistisch... Er zijn in het verleden al enorme botnets blootgelegd. Ik zeg niet dat deze daarom voor een MD5 te kraken gebruikt worden (lijkt me eerder uitzonderlijk), maar het zou wel kunnen. Ik herinner me bijvoorbeeld nog het Grum botnet, dat maar liefst (even gegoogeled) 560 000 840 000 'slachtoffers' had.
Of MD5 nu lastig te kraken is of niet, ik vind het naïef wanneer je beweerd dat MD5 de beste oplossing is. Er zijn nu eenmaal sterkere algoritmes beschikbaar. Waarom zou je dan ook niet gebruiken? Dit is ook eerder het punt dat ik wou maken en wellicht ook Chris.
Wat ik in feite heb gedaan is een sha1 encryptie over het wachtwoord gedaan, een md5 encryptie over de gebruikersnaam gedaan (wat dus de salt moet worden), en vervolgens een random getal ingevoerd als pepper. vervolgens dit achter elkaar geplaatst.
als jullie hier een oordeel over kunnen vellen zou dat nice wezen.
had je er al over na gedacht hoe je het bij het opvragen gaat controleren ?
maar ik zou hellemaal geen md5 meer gebruiken.
ik zou het dan zo doen:
<?PHP
$wachtwoordencrypt = hash('sha512', $wachtwoord . $pepper_string);
?>
(met eventueel nog een salt erbij)
Je kan dan beter ipv dat random getal een vaste waarde pakken en daar een leuke berekening op los laten. Voorbeeld: Gebruikers registratie datum van de gebruiker en daar 1000 dagen vanaf halen dan heb je gelijk een leuke pepper