如何使用nodejs验证Symfony2 sha512密码

Gil*_*esC 1 hash pbkdf2 node.js symfony

我需要能够验证在node其中产生并使用存储一些密码Symfony2sha512编码.

我可以检索hash并且salt正常但是在使用时crypto我无法使用与数据库中存储的盐匹配的salt来生成哈希.

Symfony security.yml

security:
    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512
Run Code Online (Sandbox Code Playgroud)

哈希存储在DB中

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
Run Code Online (Sandbox Code Playgroud)

盐存储在DB中

qu7rjvaietws8kg4cgsggksookwsws8
Run Code Online (Sandbox Code Playgroud)

由于我正在使用的节点端有一个salt,crypto.pbkdf2Sync配置中没有设置迭代,看起来Symfony的默认值是1000.但是默认长度是40但是存储的散列长度是128,所以使用128作为长度(试了40但没有成功).

我也尝试过Symfony 2使用的5000次迭代MessageDigestPasswordEncoder,并将原始密码与salt合并,因为symfony raw_password{salt}没有成功.

如果我使用pbkdf2Sync生成长度的密钥40(根据symfony默认值)然后使用它来更新哈希生成,我也可以获得足够长的base64crypto.createHash

var hash = user.password;
var salt = user.salt;

console.log(hash);

console.log(crypto.pbkdf2Sync("password", salt, 1000, 128 >> 1, "sha512").toString("base64"));
Run Code Online (Sandbox Code Playgroud)

生成的哈希大小和格式与存储在数据库中的大小匹配,但它们与我的问题值不匹配.我还尝试了动态生成的多个迭代值,没有任何运气.

产量

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ==
w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA==
Run Code Online (Sandbox Code Playgroud)

如何生成散列,使其与Symfony 2使用的方式相匹配?

Ale*_*chi 6

Symfony使用sha512进行5000次迭代.

  1. 他们将原始密码与用户的盐连接起来以生成新的盐
  2. 它们使用上面的数据生成起始哈希.
  3. 在每次迭代之前,使用salt在步骤1生成的当前散列+ new更新先前的散列.

在节点中,在每次迭代时,您应该将先前的散列消化为二进制,并在最终消化中将其消化为base64,以模仿Symfony所做的事情.

一个例子:

var crypto = require('crypto');

var encodePassword = function (raw, salt) {
    var salted = raw + '{'+salt+'}',
        hash = crypto.createHash('sha512').update(salted, 'utf-8');

    for (var i = 1; i < 5000 ; i++) {
        hash = crypto.createHash('sha512').update(hash.digest('binary')+salted);
    }

    return hash.digest('base64');
};

console.log("Password: "+ encodePassword("secret", "h2zaays1cx2og00c6ow2gc0k4skg41g"));
Run Code Online (Sandbox Code Playgroud)