Javascript中的Symfony2密码编码器函数

Javascript中的Symfony2密码编码器函数,javascript,php,symfony,password-encryption,cryptojs,Javascript,Php,Symfony,Password Encryption,Cryptojs,我使用FOSUserBundle和FOSRestBundle创建了一个Symfony2应用程序。我想使用RESTAPI将其他应用程序与我的Symfony应用程序连接起来。 我需要用Javascript编写Symfony密码编码器函数。 实际上,在PHP中,它是这样的: $salt = "secret"; $password = "azerty"; $salted = $password.'{'.$salt.'}'; $digest = hash('sha512', $salted, true);

我使用FOSUserBundle和FOSRestBundle创建了一个Symfony2应用程序。我想使用RESTAPI将其他应用程序与我的Symfony应用程序连接起来。 我需要用Javascript编写Symfony密码编码器函数。 实际上,在PHP中,它是这样的:

$salt = "secret";
$password = "azerty";
$salted = $password.'{'.$salt.'}';
$digest = hash('sha512', $salted, true);

for ($i = 1; $i < 5000; $i++) {
    $digest = hash('sha512', $digest.$salted, true);
}
$digest = base64_encode($digest);

return $digest;
$salt=“secret”;
$password=“azerty”;
$salted=$password.{.$salt.};
$digest=hash('sha512',$salted,true);
对于($i=1;$i<5000;$i++){
$digest=hash('sha512',$digest.$salted,true);
}
$digest=base64_编码($digest);
返回$digest;
在Javascript中,我尝试使用CryptoJS库。我的代码是:

var salt = 'secret',
    password = 'azerty',
    salted = password + '{' + salt + '}'
    digest = CryptoJS.SHA512(salted);

for (var i=1; i<5000; i++) {
    digest = CryptoJS.SHA512(digest+salted);
}

digest = digest.toString(CryptoJS.enc.Base64);

return digest;
var salt='secret',
密码='azerty',
salted=密码+'{'+salt+'}'
摘要=CryptoJS.SHA512(盐渍);
对于(var i=1;i它不起作用,因为“[t]您返回的哈希值还不是字符串。它是一个WordArray对象。当您在字符串上下文中使用WordArray对象时,它会自动转换为十六进制字符串。”()
通过使用
digest=CryptoJS.SHA512(digest+salted);
digest被转换为十六进制字符串。 如果您将PHP代码更改为

$salt = "secret";
$password = "azerty";
$salted = $password.'{'.$salt.'}';
$digest = hash('sha512', $salted, false);

for ($i = 1; $i < 5000; $i++) {
    $digest = hash('sha512', $digest.$salted, false);
}

return $digest;
$salt=“secret”;
$password=“azerty”;
$salted=$password.{.$salt.};
$digest=hash('sha512',$salted,false);
对于($i=1;$i<5000;$i++){
$digest=hash('sha512',$digest.$salted,false);
}
返回$digest;
并以十六进制字符串的形式返回摘要(
digest+'
digest.toString(CryptoJS.enc.hex)
就可以了)。
我不知道如何更改JavaScript代码以匹配原始PHP代码。

Ok@timothymctim的回答帮助了我。实际上,我认为这是关于字符编码的问题。 这里有一个(奇怪的)解决方案:

PHP:

$salt = "secret";
$password = "azerty";
$salted = $password.'{'.$salt.'}';
$digest = hash('sha512', $salted, true);

for ($i = 1; $i < 5000; $i++) {
    $digest = hash('sha512', utf8_encode($digest).$salted, true);
}
$digest = base64_encode($digest);

return $digest;
$salt=“secret”;
$password=“azerty”;
$salted=$password.{.$salt.};
$digest=hash('sha512',$salted,true);
对于($i=1;$i<5000;$i++){
$digest=hash('sha512',utf8_编码($digest)。$salted,true);
}
$digest=base64_编码($digest);
返回$digest;
还有Javascript:

var salt = 'secret',
password = 'azerty',
salted = password + '{' + salt + '}'
digest = CryptoJS.SHA512(salted);

for (var i=1; i<5000; i++) {
    digest = CryptoJS.SHA512(digest.toString(CryptoJS.enc.Latin1)+salted);
}

digest = digest.toString(CryptoJS.enc.Base64);

return digest;
var salt='secret',
密码='azerty',
salted=密码+'{'+salt+'}'
摘要=CryptoJS.SHA512(盐渍);

对于(var i=1;i什么是
它不起作用的意思?是的,对不起,我应该说,返回的摘要不一样。PHP返回zbncdqnuk31gbe5y10ag5mubezsn9kngmiorrmts+diwtdtrafjwjomjfqfp7mmtfgvrm8grux0q87hmynyihw==和Javascript返回q2lsiVES6m+Bxmzz87jk5z8epHE+jcd8tficibw3kbukuke+f9huatkhvqjdnasxw5fewgc2eng44yka=@Colzak:Wh在客户端,我只获取用户的密码salt,因此当用户键入密码时,我生成相应的哈希,并将其发送到服务器和co与db中的密码不同。这样做,密码就不会通过api调用传输。无论如何,我想这个问题没有解决方案。在其他语言中(如java)我看到了一个工作示例,但在Javascript中,我想它有点复杂。也许我不需要这样做,我可以对密码进行base64_编码并通过https…idk发送。感谢您的回复。我明白了您的意思,但不幸的是,我需要让php按原样运行。我不知道是否存在任何解决方案。我将尝试更多的方法,b但我想我得换一种方式。