@Robert
Hvis jeg vil anvende salt pr. bruger så skal jeg jo gemme dem i databasen sammen med resten af brugerens oplysninger. Er det korrekt forstået?
Korrekt. Men output fra crypt() funktionen indeholder tre ting:
1) Hashet af dit password
2) Algoritmen, som blev brugt
3) Det benyttede salt
Altsammen som én streng. F.eks:
- <?php
- $password = "very secret";
- $hashed = crypt($password);
- echo "$hashed\n";
- ?>
Output af ovenstående er (i mit tilfælde):
$1$dWd39Nbq$G2qRAvah0T/3lbWR/xJPX/
Det er den streng du gemmer i databasen. Når du så skal tjekke, om et givet password var korrekt henter du strengen ud igen og gør følgende:
- <?php
- $password = 'very secret';
- $hashed = '$1$dWd39Nbq$G2qRAvah0T/3lbWR/xJPX/';
- if (crypt($password, $hashed) === $hashed) {
- echo "Yay\n";
- }
- ?>
Bruger du det samme salt for alle brugere, så kan man lave et statistisk angreb. Har du mange brugere, vil en hel del af dem have det samme password, og bruges samme salt for alle brugere, så vil de også have samme hash. Så søger man bare efter det oftest forekomne hash, og det passer sandsynligvis sammen med et af de oftest forekomne passwords.
Det problem fixer man med dynamisk hash.
Derudover hasher crypt() funktionen pr. default 5000 gange. Det giver ikke som sådan ekstra sikkerhed, men det vil tage 5000 gange så lang tid at brute force.
Indlæg senest redigeret d. 14.11.2013 14:14 af Bruger #2695