node.js - 如何使用nodejs验证Symfony2 sha512密码

标签 node.js symfony hash pbkdf2

我需要能够在node中验证一些使用Symfony2sha512编码生成和存储的密码。

我可以很好地检索哈希,但是当使用crypto时,我无法设法使用匹配的盐生成哈希存储在数据库中的那个。

Symfony 安全.yml

security:
    encoders:
        "FOS\UserBundle\Model\UserInterface": sha512

存储在数据库中的哈希值

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==

存储在数据库中的盐

qu7rjvaietws8kg4cgsggksookwsws8

由于 Node 端有盐,我使用crypto.pbkdf2Sync,配置中没有设置迭代,Symfony 默认值似乎是 1000。但是默认长度是40 但存储的哈希长度是 128,因此使用 128 作为长度(尝试了 40 但没有成功)。

我还尝试了 Symfony 2 MessageDigestPasswordEncoder 使用的 5000 次迭代,并将原始密码与盐合并,就像 symfony 所做的 raw_password{salt} 一样,但没有成功。

如果我使用pbkdf2Sync生成长度为40的 key (按照symfony默认值),然后使用它来更新哈希,我也可以获得足够长的base64使用crypto.createHash

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

console.log(hash);

console.log(crypto.pbkdf2Sync("password", salt, 1000, 128 >> 1, "sha512").toString("base64"));

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

输出

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ==
w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA==

如何生成哈希值,使其与 Symfony 2 使用的方式匹配?

最佳答案

Symfony 使用 sha512 进行了 5000 次迭代。

  1. 他们将原始密码与用户的盐连接起来生成新的盐
  2. 他们使用上述数据生成一个起始哈希。
  3. 在每次迭代中,之前的哈希都会使用当前哈希 + 第 1 步生成的新salt 进行更新。

在 Node 中,在每次迭代中,您应该将先前的哈希消化为二进制,并最终消化为 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"));

关于node.js - 如何使用nodejs验证Symfony2 sha512密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179033/

相关文章:

php - 使用 php + gearman + node.js

node.js - 如何在 mean.io 中使用 MongoDB

sql-server - 连接到 SQL Azure 很乏味

node.js - npm 安装@types/.../node_modules/react

symfony - 用于 symfony2 CMF 的 sqlite 或 mysql

php - 如何让 Twig 忽略 Polymer 的大括号?

php - 传递给 Symfony\Component\Form\FormRenderer::renderBlock() 的参数 1 必须是 ...\FormView 的实例,给定 ...\Form 的实例

c - 如何在 C 中将原始 64 字节二进制转换为十六进制或 ASCII

java - 适用于 Android 的 MD5 哈希

algorithm - 为自定义结构生成唯一哈希?