我使用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。
答案 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代码。