【问题标题】:How to validate Symfony2 sha512 passwords using nodejs如何使用 nodejs 验证 Symfony2 sha512 密码
【发布时间】:2014-10-03 12:35:24
【问题描述】:

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

我可以很好地检索hashsalt,但是当使用crypto 时,我无法使用与存储在数据库中的盐相匹配的盐生成散列。

Symfony security.yml

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

哈希存储在数据库中

6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==

存储在数据库中的盐

qu7rjvaietws8kg4cgsggksookwsws8

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

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

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

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 使用的方式相匹配?

【问题讨论】:

    标签: node.js symfony hash pbkdf2


    【解决方案1】:

    Symfony 使用 sha512 进行 5000 次迭代。

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

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

    【讨论】:

      【解决方案2】:

      您好,它可能对某人有用。 这是我的实时网站中有效的代码的一部分。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 谢谢,看来默认确实是1000 并且已经在使用base64 编码,所以已经尝试过并且失败了。一件奇怪的事情是默认长度是 40,但存储的哈希是 128。我尝试了 40,但哈希的长度与 DB 的长度不匹配,这就是我使用 128 的原因。
        • 相当确定 sha512 映射到 MessageDigestPasswordEncoder 而不是 Pbkdf2PasswordEncoderwhich。我可能是错的。 symfony.com/doc/current/reference/configuration/security.html
        猜你喜欢
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 2015-01-29
        • 2020-02-23
        • 2021-08-29
        • 2015-08-21
        • 1970-01-01
        • 2020-04-06
        相关资源
        最近更新 更多