我需要能够在node
中验证一些使用Symfony2
和sha512
编码生成和存储的密码。
我可以很好地检索哈希
和盐
,但是当使用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 步生成的新
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/