我想在 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);
它从 pass 和 salt 创建一个哈希,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
这不是预期的。