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)
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?
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.
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]
?>
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.
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.