Veilig wachtwoorden in een DB

Gestart doorRobindh12 reacties177 weergaven

13 berichten · pagina 1 van 1

Robindh

Lid · Topicstarter

Berichten
22.444
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hoe kan ik op een goede manier wachtwoorden opslaan in een DB. Een simpele MD5 Hash is niet voldoende.

Welke manieren gebruiken jullie? En wat is er handig en veilig om te gebruiken?
0
Berichten
6.144
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Een gebruiker specifieke salt gebruiken en dan vervolgens [func]password_hash()[/func].
0
Robindh

Lid · Topicstarter

Berichten
22.444
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Jponsen schreef:
Een gebruiker specifieke salt gebruiken en dan vervolgens [func]password_hash()[/func].
Dus voor elke gebruiker een random salt genereren en deze ook opslaan in de DB?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
bcrypt

toevoeging op 3 juni 2015, 11:50:34:
Die doet alles voor je. Als je bijvoorbeeld
Als je hallo123 door de hash haalt komt er x uit en als je hallo123 nóg een keer door de hash haalt dan komt er y uit.
Komt omdat er wordt gehasht met een unieke salt.
Bedoeling van een salt is dat deze altijd uniek moet zijn en nergens opgeslagen dient te worden.
Niet in je code en ook niet in je database.
Je moet je wachtwoord hashen met een random / unieke salt die daarna nooit ergens meer kan opduiken. Zo kan je namelijk ook niet brute force gebruiken.
(net zolang random (of rain tables) gaan hashen tot je de hash als uitkomst hebt, je input is dan je wachtwoord)
0
Robindh

Lid · Topicstarter

Berichten
22.444
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Jessee schreef:
bcrypt
toevoeging op 3 juni 2015, 11:50:34:
Die doet alles voor je. Als je bijvoorbeeld
Als je hallo123 door de hash haalt komt er x uit en als je hallo123 nóg een keer door de hash haalt dan komt er y uit.
Komt omdat er wordt gehasht met een unieke salt.
Bedoeling van een salt is dat deze altijd uniek moet zijn en nergens opgeslagen dient te worden.
Niet in je code en ook niet in je database.
Je moet je wachtwoord hashen met een random / unieke salt die daarna nooit ergens meer kan opduiken. Zo kan je namelijk ook niet brute force gebruiken.
(net zolang random (of rain tables) gaan hashen tot je de hash als uitkomst hebt, je input is dan je wachtwoord)

Maar stel een wachtwoord is hallo123 je haalt deze door een hash en er komt uit X. Hoe kun je dan nog die unieke salt achterhalen als deze niet word opgeslagen.

Dus hoe kun je dan ontdekken dat wanneer er hallo123 en deze door een hash word gehaald deze weer gelijk is aan X en niet aan Y?
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Omdat je hem alleen opslaat met salt.
Bij het comparen (verifyen) heb je geen salt nodig.
Dan is het algoritme slim genoeg om te kijken of de hash van je wachtwoord zónder salt hetzelfde is als de hash mét salt.
bcrypt kan namelijk herkennen wat de salt is en wat niet.
0
Robindh

Lid · Topicstarter

Berichten
22.444
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ik heb eventjes gegoogled dus je gebruikt hem zo?

Codeblok (wachtwoord.php):

1
2
3
4
5
6
7
8
9
10

$options = array(cost => 11);
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."n";

$hash = $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq;

if (password_verify(rasmuslerdorf, $hash)) {
echo Password is valid!;
} else {
echo Invalid password.;
}

En dit werkt dus alleen in PHP 5.5?
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Robindh schreef:
Ik heb eventjes gegoogled dus je gebruikt hem zo?
Codeblok (wachtwoord.php):

1
2
3
4
5
6
7
8
9
10

$options = array(cost => 11);
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."n";

$hash = $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq;

if (password_verify(rasmuslerdorf, $hash)) {
echo Password is valid!;
} else {
echo Invalid password.;
}

En dit werkt dus alleen in PHP 5.5?

Ja. En hoe hoger de cost hoe moeilijker het wordt.
0
Robindh

Lid · Topicstarter

Berichten
22.444
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Dylan schreef:
Eerdere citaten tonen
Robindh schreef:
Ik heb eventjes gegoogled dus je gebruikt hem zo?
Codeblok (wachtwoord.php):
1
2
3
4
5
6
7
8
9
10

$options = array(cost => 11);
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."n";

$hash = $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq;

if (password_verify(rasmuslerdorf, $hash)) {
echo Password is valid!;
} else {
echo Invalid password.;
}

En dit werkt dus alleen in PHP 5.5?

Ja. En hoe hoger de cost hoe moeilijker het wordt.

Een cost van 10 is wel voldoende toch?
0
Berichten
14.025
Reputatie
1
Punten
0,01
Lid sinds
Laatst gezien
Robindh schreef:
Eerdere citaten tonen
Dylan schreef:
Eerdere citaten tonen
Robindh schreef:
Ik heb eventjes gegoogled dus je gebruikt hem zo?
Codeblok (wachtwoord.php):
1
2
3
4
5
6
7
8
9
10

$options = array(cost => 11);
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."n";

$hash = $2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq;

if (password_verify(rasmuslerdorf, $hash)) {
echo Password is valid!;
} else {
echo Invalid password.;
}
En dit werkt dus alleen in PHP 5.5?

Ja. En hoe hoger de cost hoe moeilijker het wordt.

Een cost van 10 is wel voldoende toch?

Hangt er vanaf hoe snel je server is. Gebruik dit eens:

[COLOR= #0000BB]<?php[/COLOR]
[COLOR= #FF8000]/**
 * This code will benchmark your server to determine how high of a cost you can
 * afford. You want to set the highest cost that you can without slowing down
 * you server too much. 8-10 is a good baseline, and more is good if your servers
 * are fast enough. The code below aims for ? 50 milliseconds stretching time,
 * which is a good baseline for systems handling interactive logins.
 */[/COLOR]
[COLOR= #0000BB]$timeTarget[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]0.05[/COLOR][COLOR= #007700];[/COLOR] [COLOR= #FF8000]// 50 milliseconds [/COLOR]

[COLOR= #0000BB]$cost[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]8[/COLOR][COLOR= #007700];[/COLOR]
[URL="http://www.php.net/do"]do[/URL] [COLOR= #007700]{[/COLOR]
    [COLOR= #0000BB]$cost[/COLOR][COLOR= #007700]++;[/COLOR]
    [COLOR= #0000BB]$start[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/microtime"]microtime[/URL][COLOR= #007700]([/COLOR]true[COLOR= #007700]);[/COLOR]
    password_hash[COLOR= #007700]([/COLOR][COLOR= #DD0000]"test"[/COLOR][COLOR= #007700],[/COLOR] PASSWORD_BCRYPT[COLOR= #007700], [[/COLOR][COLOR= #DD0000]"cost"[/COLOR] [COLOR= #007700]=>[/COLOR] [COLOR= #0000BB]$cost[/COLOR][COLOR= #007700]]);[/COLOR]
    [COLOR= #0000BB]$end[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/microtime"]microtime[/URL][COLOR= #007700]([/COLOR]true[COLOR= #007700]);
}[/COLOR] [URL="http://www.php.net/while"]while[/URL] [COLOR= #007700](([/COLOR][COLOR= #0000BB]$end[/COLOR] [COLOR= #007700]-[/COLOR] [COLOR= #0000BB]$start[/COLOR][COLOR= #007700]) <[/COLOR] [COLOR= #0000BB]$timeTarget[/COLOR][COLOR= #007700]);[/COLOR]

[URL="http://www.php.net/echo"]echo[/URL] [COLOR= #DD0000]"Appropriate Cost Found: "[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #0000BB]$cost[/COLOR] [COLOR= #007700].[/COLOR] [COLOR= #DD0000]"n"[/COLOR][COLOR= #007700];[/COLOR]
?>
0
Berichten
93.699
Reputatie
0
Punten
1,27
Lid sinds
Laatst gezien
Een hogere cost == langere laadtijd.
Langere laadtijd / parsetijd is moeilijker om het weer te kraken.
Dus dan moet je je gebruikers maar een halve seconden laten wachten, dat merken zij amper.
En als je 1000000 keer 0,5 doet is het al aardig wat extra tijd wat je kwijt bent.
0
Berichten
518
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Jessee schreef:
bcrypt
toevoeging op 3 juni 2015, 11:50:34:
Die doet alles voor je. Als je bijvoorbeeld
Als je hallo123 door de hash haalt komt er x uit en als je hallo123 nóg een keer door de hash haalt dan komt er y uit.
Komt omdat er wordt gehasht met een unieke salt.
Bedoeling van een salt is dat deze altijd uniek moet zijn en nergens opgeslagen dient te worden.
Niet in je code en ook niet in je database.
Je moet je wachtwoord hashen met een random / unieke salt die daarna nooit ergens meer kan opduiken. Zo kan je namelijk ook niet brute force gebruiken.
(net zolang random (of rain tables) gaan hashen tot je de hash als uitkomst hebt, je input is dan je wachtwoord)

Rainbowtables worden al lang niet meer gebruikt omdat bruteforceveeel sneller is geworden. Het gaat hem vooral om de snelheid, wat bij bCrypt enorm traag is.
0
Berichten
3.001
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
En mocht je webserver password_hash() niet standaard ondersteunen, gebruik dan deze Github-repo: https://github.com/ircmaxell/password_compat. Syntax etc blijft hetzelfde.
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren