I need to validate a password in a Symfony 3.3 / FriendsOfSymfony UserBundle 1.3 application from an AWS Lambda function.
The relevant password hashing code in Symfony is here https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php#L52
However the code doesn't produce the same hashes even at the first line.
In Symfony with password=test, salt=asLZCFQJ5flTtOWdphjKtpngthjK6h2FtMRSIZZ2bus
$salted = $this->mergePasswordAndSalt($raw, $salt);
$digest = hash($this->algorithm, $salted, true);
//base64_encode($digest) == '2QhirHmPwt0O5MrtTdfWsWKCCeOQO/y02Di04/aUIJxWhdNDQSGCaUuL1ONLUasdsD88CBSIzGwsePqGTCcQmA=='
// "stretch" hash
for ($i = 1; $i < $this->iterations; ++$i) {
$digest = hash($this->algorithm, $digest.$salted, true);
}
With the same details in nodejs I get:
var pass='test';
var salt='asLZCFQJ5flTtOWdphjKtpngthjK6h2FtMRSIZZ2bus';
var salted = pass + '{' + salt + '}';
var digest = sha512.update(salted).digest('binary');
//new Buffer(digest).toString('base64') == 'w5kIYsKsecKPw4LDnQ7DpMOKw61Nw5fDlsKxYsKCCcOjwpA7w7zCtMOYOMK0w6PDtsKUIMKcVsKFw5NDQSHCgmlLwovDlMOjS1HCqx3CsD88CBTCiMOMbCx4w7rChkwnEMKY'
for (var i = 1; i < 5000; ++i) {
digest = require('crypto').createHash('sha512').update(digest + salted).digest('binary');
process.stdout.write(new Buffer(digest).toString('base64')+"\n");
}
or is this a character encoding problem? The first 3 characters of the binary hash look very similar in the debuggers.
Screenshot from PHPStorm
Screenshot from WebStorm