[英]Replicate pass encryption from PHP to JS
我想在JS中復制以下PHP代碼:
$salted = $raw_pass."{".$salt."}";
$iterations = 5000;
$digest = hash('sha512', $salted, true);
// "stretch" hash
for ($i = 0; $i < $iterations; $i++) {
$digest = hash('sha512', $digest.$salted, true);
}
return base64_encode($digest);
它通過遍歷和遍歷進行5000次迭代來創建哈希。 這實際上來自Symfony的MessageDigestPasswordEncoder (為示例起見,我對代碼進行了一些更改,對於可能的拼寫錯誤感到抱歉)。
我想在JavaScript中復制它,並這樣做:
var salted = raw_pass + "{" + salt + "}"
var digest = CryptoJS.SHA512(salted);
for (var i=0;i<5000;i++){
digest = CryptoJS.SHA512(digest+salted);
}
user.password = CryptoJS.enc.Base64.stringify(digest)
創建digest
時,一切正常(兩邊都得到相同的字符串),但是反復重申后,我得到了不同的哈希值。 symfony方面正在工作,因此問題出在此JS中。
我究竟做錯了什么?
以后的編輯:我想我有一個為什么為什么不行的想法。 digest
是一個對象, salted
是一個字符串。 CryptoJS.SHA512都接受,但是我不認為digest + salted
不是所期望的。
我認為問題是在PHP中您在1
初始化了循環:
for ($i = 1; $i < $iterations; $i++)
但是在JavaScript中,您要在0
初始化循環:
for (var i=0;i<5000;i++)
我認為這里是一個問題:
<?php
$salted = $raw_pass."{"$salt."}";
?>
您忘記了一個點(。),應該是這樣的:
<?php
$salted = $raw_pass."{".$salt."}";
?>
同樣,您從1開始一次,從0開始一次(請參見下面的帖子)
我無法解決它,所以我不得不改變策略。 考慮到我正在編碼已經編碼(和加鹽)的數據,並且沒有將完整的信息提供給用戶,因此我應該是安全的。
我改為SHA1,並且正在使用btoa()
和atobe()
JS函數。
似乎您為什么不只使用PBKDF2,因為CryptoJS也提供了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.