Beste Password Encryption
Welke encryption raden jullie aan voor het opslaan van wachtwoorden? En waarom?
http://www.phphulp.nl/php/script/beveiliging/hash-bcrypt-class-encryption/1954/.
Zelf gebruik ik bcrypt. Je wachtwoord krijgt een salt & peper en de hash die je terug krijgt is iedere keer weer anders. Zie Gewijzigd op 31/08/2014 11:31:16 door B a s
password_hash() als encryptie nieuw voor je is.
http://jeremykendall.net/2014/01/04/php-password-hashing-a-dead-simple-implementation/
Kijk ook eens naar http://jeremykendall.net/2014/01/04/php-password-hashing-a-dead-simple-implementation/
@Bas: Waarom heeft bcrypt jouw voorkeur?
@Ward: Raad jij password_hash() aan? En waarom?
Bij password_hash() krijg je een "fool proof" password_verify() voor de wachtwoordcontrole cadeau. Bovendien is het geheel "future proof" voor nieuwe encryptiealgoritmen dankzij password_needs_rehash(). Als je dus niet precies weet wat je zou moeten bouwen (en ook niet waarom eigenlijk), dan zou ik deze password_* functiefamilie aanbevelen.
Ik geef voorkeur aan bcrypt omdat deze (naast je eigen salt) zelf een ingebouwde salt heeft. Het genereert random iedere keer dat je inlogt een random hash waardoor kwaadwilligen je wachtwoord minder snel kunnen verkrijgen.
Gebruik je dit niet, dan kunnen kwaadwilligen via een zogenoemde ranbow table je wachtwoord snel verkijgen. Gebruik je bijvoorbeeld alleen letters en cijfers en is je wachtwoord 6 karakters lang en MD5 'beveiligd' (+/- 335 MB), dan is deze binnen 40 seconden te kraken.
Er blijven uiteraard vele discussies over welke wel en welke niet gebruiken. Stel je zelf wel de vraag waarvoor je het gaat gebruiken. Heb je bijvoorbeeld een website waaraan vele persoonlijke informatie is gekoppeld (namen, adressen, geboortedata, bankgegevens), dan moet je je hierin verdiepen. Is het voor een simpel forum dan dien je het ook goed te beveiligen, maar vormt de data die je hebt een minder groot risico om gehackt te worden. Het is minder interessant.
Een snelle Google levert tevens een grote voorstander van Bcrypt op, maar ook een grote tegenstander.
Edit:
Linkjes toegevoegd
Gewijzigd op 31/08/2014 13:27:26 door B a s
Een password word Heel mooi random gemaakt, waardoor het altijd anders is.
Even een opzetje zodat je ziet wat er gebeurd:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$options = [
'cost' => 12,
];
// Get the password from post
$passwordFromPost = 'test';
$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
echo $hash;
echo '<br />';
// Get the password from the database and compare it to a variable (for example post)
//$passwordFromPost = $_POST['password'];
$hashedPasswordFromDB = '$2y$12$ZYN23Q1VG1T2a2nJjAjw7.wvusVCWxQSRq9q1rYEIJakVjtsjfVki';
if (password_verify($passwordFromPost, $hashedPasswordFromDB))
{
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
$options = [
'cost' => 12,
];
// Get the password from post
$passwordFromPost = 'test';
$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
echo $hash;
echo '<br />';
// Get the password from the database and compare it to a variable (for example post)
//$passwordFromPost = $_POST['password'];
$hashedPasswordFromDB = '$2y$12$ZYN23Q1VG1T2a2nJjAjw7.wvusVCWxQSRq9q1rYEIJakVjtsjfVki';
if (password_verify($passwordFromPost, $hashedPasswordFromDB))
{
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>
Gewijzigd op 31/08/2014 14:39:30 door Bart V B
Ik zit met het probleem dat ik met PHP 5.3 zit. Bcrypt en password_hash zijn dus helaas geen oplossingen.
Ik heb het geprobeerd met deze code:
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
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
<?php
$options = [
'cost' => rand(6,12)
];
// Get the password from post
$passwordFromPost = 'test';
$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
echo $hash;
echo '<br />';
// Get the password from the database and compare it to a variable (for example post)
//$passwordFromPost = $_POST['password'];
$hashedPasswordFromDB = '$2y$11$iMqEwGNqcsskpAAdPEJPbO/bsatfcBlc71TyUgy1i8i0wXoArrjXe';
if (password_verify($passwordFromPost, $hashedPasswordFromDB))
{
echo 'Password is valid!';
// CHECK TO SEE PASSWORD NEED REHASH
if (password_needs_rehash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options))
{
$hashNew = password_hash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options);
echo '<br>';
echo $hashNew;
}
}
else
{
echo 'Invalid password.';
}
?>
$options = [
'cost' => rand(6,12)
];
// Get the password from post
$passwordFromPost = 'test';
$hash = password_hash($passwordFromPost, PASSWORD_BCRYPT, $options);
echo $hash;
echo '<br />';
// Get the password from the database and compare it to a variable (for example post)
//$passwordFromPost = $_POST['password'];
$hashedPasswordFromDB = '$2y$11$iMqEwGNqcsskpAAdPEJPbO/bsatfcBlc71TyUgy1i8i0wXoArrjXe';
if (password_verify($passwordFromPost, $hashedPasswordFromDB))
{
echo 'Password is valid!';
// CHECK TO SEE PASSWORD NEED REHASH
if (password_needs_rehash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options))
{
$hashNew = password_hash($hashedPasswordFromDB, PASSWORD_BCRYPT, $options);
echo '<br>';
echo $hashNew;
}
}
else
{
echo 'Invalid password.';
}
?>
Als ik op mijn f5 knop blijf rammen dan update hij altijd de hash. Dus een vaste arrray met cost => 12. Als ik de array aanpas met een rand(6,12) dan update hij af en toe wel en af en toe niet. Is het gebruikelijk om daar een rand() in te bouwen?
Als je dan toch iets wilt variëren, neem dan de salt onder handen. Die moet minstens even lang zijn als de hash zelf én globaal uniek zijn (dus niet slechts aselect, maar ook nergens in de database voorkomen: niet als andere salt, maar ook niet als bijvoorbeeld afgeleide van een e-mailadres).
Ward van der Put op 31/08/2014 14:32:53:
Top, werkt perfect :)
Quote:
Hogere kosten zijn veiliger. Er is geen reden om een hash met hoge kosten te vervangen door een onveiligere hash met lagere kosten, dus waarom wil je dat aselect variëren
@Ward,
Dat snap ik, wat ik wil snappen is waarom, als ik een vaste hoge hash kosten gebruik waarom ik altijd password_needs_rehash() zijn werk zie doen, terwijl als ik die hoge kosten @random maak niet.
Dan zie ik namelijk gebeuren wat ik zou verwachten, en dat is soms wel een nieuwe password hash word gedaan en soms niet. Vandaar dat ik de functie nog niet helemaal snap.
Want dat zou betekenen dat hij hem dus altijd een update query zou doen naar de database.
Op zich niet zo'n groot probleem maar ik verwachte van die functie dat hij om de zoveel tijd dit eens zou uitvoeren.
EDIT.
Hmmm... vreemd, even een nieuwe hash in de string geplakt en nu doet hij wel wat ik verwacht. Laten we zeggen "het werkt" :S
Gewijzigd op 31/08/2014 21:46:16 door Bart V B