如何使用nodejs验证Symfony2 sha512密码

时间:2014-10-03 12:35:24

标签: node.js symfony hash pbkdf2

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

我可以检索hashsalt就好了但是当使用crypto时,我无法使用与数据库中存储的盐匹配的salt生成哈希。

Symfony security.yml

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

存储在DB

中的哈希值
6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==

存储在DB中的盐

qu7rjvaietws8kg4cgsggksookwsws8

由于节点端存在使用crypto.pbkdf2Sync的salt,因此配置中没有设置迭代,看起来Symfony默认值为1000.但默认长度为40但是存储的哈希长度是128,因此使用128作为长度(尝试40但没有成功)。

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

如果我使用pbkdf2Sync生成长度为40的密钥(根据symfony默认值),然后使用它来更新使用{{1}的哈希生成,我也可以获得足够长的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"));

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

3 个答案:

答案 0 :(得分:6)

Symfony使用sha512进行5000次迭代。

  1. 他们将原始密码与用户的盐连接起来以生成新的盐
  2. 他们使用上述数据生成起始哈希值。
  3. 在每次迭代之前,使用在步骤1生成的当前哈希+新salt更新上一个哈希值。
  4. 在节点中,在每次迭代时,你应该将前一个散列消化为二进制,最后消化为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"));
    

答案 1 :(得分:1)

你好可能会对某人有用。 这是我的实时网站的代码的一部分。

https://gist.github.com/konstantinzolotarev/deec71876739f8bf1058

答案 2 :(得分:0)

检查Pbkdf2PasswordEncoder源代码以查看默认值。另请注意,Symfony默认会执行base64_encode