wachtwoorden hashen
ik hoorde van een kennis van mij dat het niet veilig is om je wachtwoord
op te slaan met SHA1+ een salt hij zij dat dat achterhaalt is en dat ik crypt() moet gebruiken
maar ik las op het internet dat dat juist achterhaalt is
dus daarom is mijn vraag:
hoe sla je wachtwoorden het beste op in de database?
alvast bedankt voor jullie reacties
Ik stel voor dat je password_hash() gebruikt. Voor PHP < 5.5 kun je https://github.com/ircmaxell/password_compat gebruiken. Dan gebruik je het Bcrypt (crypt met blowfish) algoritme.
Het Scrypt algoritme is aan alternatief, maar is wat ingewikkelder om werkend te krijgen.
Gewijzigd op 07/03/2014 16:19:15 door Dos Moonen
http://www.php.net/manual/en/function.password-verify.php gebruik je trouwens om het wachtwoord te controleren.
Gewijzigd op 07/03/2014 16:29:01 door Dos Moonen
waarom? 2 soorten hash op 1 password is toch veiliger? of niet?
Rule #1 Do NOT talk about fight club.
Rule #2 Do NOT roll your own crypto.
Rule #3 No really, DO NOT DO IT. You are not a group of experts.
Het is niet veiliger. Het is minder veilig. Een klein beetje minder veilig.
Maar je kunt het nu nog makkelijk weghalen, waardoor het weer ietsjes veiliger is.
Hopelijk maak je door mijn overdreven reactie in de toekomst minder assumpties. De meest recente best practices opzoeken kan nooit kwaad.
https://security.stackexchange.com/ is wel interessant.
PS. mocht je een reden willen: bcrypt(password) is jaren lang getest door experts, bcrypt(sha1(password)) is dat (waarschijnlijk) niet(/minder)
Gewijzigd op 07/03/2014 17:14:00 door Dos Moonen
maar hoe doe je dat met password_hash?
Mocht je het om een of andere vreemde reden zelf willen doen, bekijk dan voorbeeld #3: http://www.php.net/manual/en/function.password-hash.php
Jsk28jskme823
En een andere user heeft ook het wachtwoord 'test' dan is de hash toch hetzelfde
En als je database gestolen is kan de hacker al de password hints zien en weet hij het wachtwoord daarom moet er in de db een unieke code zitten waarmee het wachtwoord word gehasht. Hoe moet dat hier?
Plus vergelijken van het opgegeven wachtwoord met de opgeslagen hash via password_verify() is niet vatbaar voor timing attacks.
Nogmaals: als je toch zelf een salt wilt genereren (niet aangeraden aangezien meerdere mensen de salt generatie implementatie van password_hash() bestudeerd hebben) bekijk dan voorbeeld #3 op http://www.php.net/manual/en/function.password-hash.php
Gewijzigd op 08/03/2014 09:42:11 door Dos Moonen
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
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
<?php
function salt($pass, $salt="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", $str="")
{
$pass = str_replace(" ", "", $pass);
$pass = strrev($pass);
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}
$split_len = floor(max($arr) / (min($arr) - 1));
$salt = explode(" ", chunk_split($salt, $split_len, " "));
array_pop($salt);
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
function salt($pass, $salt="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", $str="")
{
$pass = str_replace(" ", "", $pass);
$pass = strrev($pass);
$arr[0] = strlen($pass);
$arr[1] = strlen($salt);
while($arr[0] > $arr[1] + 1)
{
$salt = $salt.$salt;
$arr[1] = strlen($salt);
}
$split_len = floor(max($arr) / (min($arr) - 1));
$salt = explode(" ", chunk_split($salt, $split_len, " "));
array_pop($salt);
$salt = array_reverse($salt);
$j = $arr[0] > count($salt) ? $arr[0] : count($salt);
for($i=0; $i<$j; $i++)
{
if(isset($pass{$i})) $str .= $pass{$i};
if(isset($salt[$i])) $str .= $salt[$i];
}
return $str;
}
?>
ik gebruik al een tijdje deze salt.
kan ik deze ook gewoon gebruiken
met daar password_hash overheen?
Houd het gewoon bij hash_password($password) (als je niet wilt dat het default algoritme in de toekomst nieuwe hashes met een ander algoritme gaat hashen, dan specificeer je ook nog zelf het algoritme)
Gewijzigd op 08/03/2014 13:15:29 door Dos Moonen
http://www.phphulp.nl/php/script/php-algemeen/beveiligde-login-en-registratie/1873/uwx3gphp/1535/
en ik vond het script ook nog ergens anders op het internet
Vergelijk dat met het advies gegeven op https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords
- goede beargumentatie
- goede repuratie (119k aan repuratie is erg veel)
- advies is gegeven door meerdere mensen (182 votes)
password_hash() is
- toegevoegd aan PHP
- gereviewed door meerdere mensen: https://security.stackexchange.com/questions/16506/security-review-password-hash-implementation-for-php
- is PHP 5.5 ingesteld om standaard Bcrypt te gebruiken (het enige ondersteunde algoritme op het moment, nieuwe algoritme kunnen in nieuwere PHP versies toegevoegd worden)
Bcrypt is bestudeerd door experts en zo'n 10 jaar oud geloof ik. Oud en geen gevonden kwetsbaarheden is een goed iets voor dit soort dingen.