Veilig alternatief MD5
Wat is op dit moment wel een veilig alternatief?
Ik heb dingen gelezen over sha2 en salt, maar die berichten komen allemaal uit 2012.
Ik denk dat men op dit moment welweer wat stappen verder zijn.
Kijk eens naar bcrypt()
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$password = $_POST['mw_pass'];
// create a random salt
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
// hash incoming password - this works on PHP 5.3 and up
$userpassword = crypt($password, '$2a$12$' . $salt);
and up
$hash = crypt($password, '$2a$12$' . $salt);
// create a random salt
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
// hash incoming password - this works on PHP 5.3 and up
$userpassword = crypt($password, '$2a$12$' . $salt);
and up
$hash = crypt($password, '$2a$12$' . $salt);
Gewijzigd op 25/05/2014 14:43:56 door J C
http://www.php.net/manual/en/function.password-hash.php
Toegevoegd aan PHP in 5.5, maar er is een PHP implementatie te vinden: zie "userland implementation" onder "See Also". De PHP implementatie kan je gebruiken vanaf PHP 5.3.7, drie alinea's verder valt te lezen waarom.
Op het moment is bcrypt het enige algoritme dat password_hash() ondersteund, maar het versimpelt het gebruik.
Aangezien je snel fouten kunt maken met cryptografie door onwetendheid, verkeerde aannamens en andere oorzaken is het altijd een goed zelf zo min mogelijk te doen. Gebruik liever iets waar veel mensen (hopelijk een paar experts) naar hebben gekeken of het correct gedaan is.
Je kunt het zelf met crypt() voor elkaar krijgen, maar dan moet je zelf dus meer doen, wat een slecht idee is.
Een probleem met de bovenstaande code is dat sha1(microtime(true), true) gebruikt wordt om een 'random' salt te genereren. Het doel van microtime() is niet om het te gebruiken tijdens het genereren van random data. Daar zijn gespecialiseerde oplossingen voor. *nix systemen heb je bijna altijd wel /dev/random tot je beschikking, en soms ook /dev/urandom. /dev/urandom is iets minder random (nog steeds genoeg voor het genereren van salt) maar heeft het voordeel dat het niet uitgeput raakt. /dev/random krijgt er per tijdeenheid (vraag me niet hoeveel tijd) een nummer bij.
Een ander probleem is te lezen op de crypt() documentatie:
"Ik heb dingen gelezen over sha2 en salt, maar die berichten komen allemaal uit 2012."
Niet echt, bcrypt is al meer dan 10+ jaar oud geloof ik. Bij oude algoritme is over het algemeen meer onderzoek gedaan naar mogelijke zwakheden. Hoe langer er niets gevonden is, hoe beter de reputatie van het algoritme. Jammer genoeg is dat niet altijd het geval.
Erg goed en interessant leesvoer: https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords
Toevoeging op 25/05/2014 22:13:47:
Ohja, ook wel interessant: https://password-hashing.net/
Gebruik liever de password_hash() functie: Toegevoegd aan PHP in 5.5, maar er is een PHP implementatie te vinden: zie "userland implementation" onder "See Also". De PHP implementatie kan je gebruiken vanaf PHP 5.3.7, drie alinea's verder valt te lezen waarom.
Op het moment is bcrypt het enige algoritme dat password_hash() ondersteund, maar het versimpelt het gebruik.
Aangezien je snel fouten kunt maken met cryptografie door onwetendheid, verkeerde aannamens en andere oorzaken is het altijd een goed zelf zo min mogelijk te doen. Gebruik liever iets waar veel mensen (hopelijk een paar experts) naar hebben gekeken of het correct gedaan is.
Je kunt het zelf met crypt() voor elkaar krijgen, maar dan moet je zelf dus meer doen, wat een slecht idee is.
Een probleem met de bovenstaande code is dat sha1(microtime(true), true) gebruikt wordt om een 'random' salt te genereren. Het doel van microtime() is niet om het te gebruiken tijdens het genereren van random data. Daar zijn gespecialiseerde oplossingen voor. *nix systemen heb je bijna altijd wel /dev/random tot je beschikking, en soms ook /dev/urandom. /dev/urandom is iets minder random (nog steeds genoeg voor het genereren van salt) maar heeft het voordeel dat het niet uitgeput raakt. /dev/random krijgt er per tijdeenheid (vraag me niet hoeveel tijd) een nummer bij.
Een ander probleem is te lezen op de crypt() documentatie:
Quote:
Versions of PHP before 5.3.7 only support "$2a$" as the salt prefix: PHP 5.3.7 introduced the new prefixes to fix a security weakness in the Blowfish implementation. Please refer to » this document for full details of the security fix, but to summarise, developers targeting only PHP 5.3.7 and later should use "$2y$" in preference to "$2a$".
"Ik heb dingen gelezen over sha2 en salt, maar die berichten komen allemaal uit 2012."
Niet echt, bcrypt is al meer dan 10+ jaar oud geloof ik. Bij oude algoritme is over het algemeen meer onderzoek gedaan naar mogelijke zwakheden. Hoe langer er niets gevonden is, hoe beter de reputatie van het algoritme. Jammer genoeg is dat niet altijd het geval.
Erg goed en interessant leesvoer: https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords
Toevoeging op 25/05/2014 22:13:47:
Ohja, ook wel interessant: https://password-hashing.net/
Gewijzigd op 25/05/2014 17:30:29 door Dos Moonen
Dank u
Gewijzigd op 26/05/2014 04:18:33 door johan de wit