0

我想在 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这不是预期的。

4

4 回答 4

3

我认为问题是在 PHP 中你初始化循环1

for ($i = 1; $i < $iterations; $i++)

但是在 JavaScript 中,你初始化循环0

for (var i=0;i<5000;i++)
于 2014-04-18T19:28:19.553 回答
0

为什么不直接使用PBKDF2,因为 CryptoJS 似乎也提供了它。

于 2014-04-19T17:08:48.053 回答
0

我无法修复它,所以我不得不改变策略。考虑到我正在编码已经编码(和加盐)的数据,并且我没有向用户提供全部信息,我应该是安全的。

我更改为 SHA1,我正在使用btoa()atobe()JS 函数。

于 2014-04-19T16:57:54.733 回答
0

我认为这里有一个问题:

<?php
    $salted = $raw_pass."{"$salt."}";
?>

您忘记了一个点( . ),应该是这样的:

<?php
    $salted = $raw_pass."{".$salt."}";
?>

此外,您从 1 开始一次,从 0 开始一次(见下面的帖子)

于 2014-04-18T19:28:10.817 回答