2014-09-19 95 views
0

我使用FOSUserBundle和FOSRestBundle創建了Symfony2應用程序。我想使用rest api將其他應用程序連接到我的Symfony應用程序。 我需要在Javascript中編寫Symfony密碼編碼器函數。 其實在PHP中,它是這樣:Javascript中的Symfony2密碼編碼器功能

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

但猜猜是什麼?它不起作用,我不知道爲什麼。 任何人都可以幫忙嗎? :)

Regards, Colzak。

+2

「它不工作」是什麼意思? – Xatenev 2014-09-19 07:25:35

+0

對不起,我應該說,返回的摘要是不一樣的。 PHP返回 ZBNCDQnUk31GBE5y10AG5MUbEzsN9kNGmiORRMTss + DiwtDtRaFJwjoMJQFp7mMTfgvrm8GrUx0q87hmYNYihw == 和JavaScript返回 q2lsiVES6m + Bxmzz87jk5z8epHE + jcd8tfIcIBWVx3KBuke + F9HuaahTHkhvqJDNASxw5mFEWgc2eng44Z8yKA == – Colzak 2014-09-19 07:36:26

+0

@Colzak:什麼是你真正想實現什麼?這看起來真的很可怕。 – lxg 2014-09-19 10:00:36

回答

2

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; 

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

我不知道該怎麼想。 非常感謝大家幫助!

0

它不起作用,因爲「你找回的哈希值不是字符串,它是一個WordArray對象,當你在字符串上下文中使用一個WordArray對象時,它會自動轉換爲十六進制字符串。 「 (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代碼。

+0

感謝您的回覆。我明白了你的意思,但不幸的是,我需要讓PHP功能保持原樣。我不知道是否有解決方案。我會嘗試更多的事情,但我想我將不得不採取另一種方式。 – Colzak 2014-09-19 12:27:42