Er is bij ons op kantoor een .NET webapplicatie in gebruik die een 'change password' functionaliteit ontbeert. Na even snuffelen in de database kom ik er achter dat de passwords enigszins gestructureerd opgeslagen zijn, fijn dacht ik.. dan bouw ik zelf in PHP een change-password pagina.
Het password-veld in de database van de applicatie heeft de volgende content bij een gebruiker met als wachtwoord alleen een 'a'.
Duidelijke parameters dacht ik: pbkdf2 crypto functie met sha512 gehashde key. De volgende parameter is het aantal iterations in hexadecimaal, 7d0 = 2000. De volgende parameter moet de salt zijn, lijkt base64. Net als de laatste parameter, de hash zelf in base64.
In PHP vervolgens de volgende code gebruikt om de hash te berekenen:
Met als resultaat:
Nou is het probleem dat ik met geen mogelijkheid dezelfde hash krijg als die in de database staat. Ik heb ook al geprobeerd de salt als string in de functie te doen ipv binary maar daarmee kom ik niet op de juiste hash uit. Wat zie ik over het hoofd?
Het password-veld in de database van de applicatie heeft de volgende content bij een gebruiker met als wachtwoord alleen een 'a'.
code:
1
| $pbkdf2_sha512$iter=7d0$v1t2oGEfc7cJf0vy$8ANP+A+6nKCOtx/f0VoI4HuXUFxTdmw13vpy5tZPRt7z10BT+hwBNWvsRpfcnQkjHIj8YGRhmz0UXdzipnEX/A== |
Duidelijke parameters dacht ik: pbkdf2 crypto functie met sha512 gehashde key. De volgende parameter is het aantal iterations in hexadecimaal, 7d0 = 2000. De volgende parameter moet de salt zijn, lijkt base64. Net als de laatste parameter, de hash zelf in base64.
In PHP vervolgens de volgende code gebruikt om de hash te berekenen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| $originalhash = "8ANP+A+6nKCOtx/f0VoI4HuXUFxTdmw13vpy5tZPRt7z10BT+hwBNWvsRpfcnQkjHIj8YGRhmz0UXdzipnEX/A=="; $password = "a"; $iterations = 2000; $salt = base64_decode("v1t2oGEfc7cJf0vy"); $calculatedhash = hash_pbkdf2("sha512", $password, $salt, $iterations, 0, true ); echo "<table>"; echo "<tr><td>Original hash</td><td>".$originalhash."</td></tr>"; echo "<tr><td>Calculated hash</td><td>".base64_encode($calculatedhash)."</td></tr>"; echo "</table>"; |
Met als resultaat:
code:
1
2
| Original hash 8ANP+A+6nKCOtx/f0VoI4HuXUFxTdmw13vpy5tZPRt7z10BT+hwBNWvsRpfcnQkjHIj8YGRhmz0UXdzipnEX/A== Calculated hash lVUYgBmbuqEJoXYS57wGykiIuS8WaTmnYeTIDlKodO2K1tzZv5KhcNdh0dn+M8qHDtIn3OzAdnP0VPDNyFIspQ== |
Nou is het probleem dat ik met geen mogelijkheid dezelfde hash krijg als die in de database staat. Ik heb ook al geprobeerd de salt als string in de functie te doen ipv binary maar daarmee kom ik niet op de juiste hash uit. Wat zie ik over het hoofd?