Javascript中的Symfony2密码编码器功能

时间:2014-09-19 07:23:37

标签: javascript php symfony password-encryption cryptojs

我使用FOSUserBundle和FOSRestBundle创建了一个Symfony2应用程序。我想使用rest api将其他应用程序与我的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;

在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;
但是猜猜怎么着?它不起作用,我不知道为什么。 有人可以帮忙吗? :)

此致 Colzak。

2 个答案:

答案 0 :(得分:2)

好的@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;

和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;

我不知道该怎么想。 无论如何,谢谢所有帮助过的人!

答案 1 :(得分:0)

它不起作用,因为&#34;哈哈,你回来的还不是一个字符串。它是一个WordArray对象。在字符串上下文中使用WordArray对象时,它会自动转换为十六进制字符串。&#34; (source) 通过使用digest = CryptoJS.SHA512(digest+salted);摘要转换为十六进制字符串。 如果您将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;

并将摘要作为十六进制字符串返回(digest + ''digest.toString(CryptoJS.enc.Hex)将会这样做)它将起作用。 我不知道如何更改JavaScript代码以匹配原始的PHP代码。