我需要能够在node
中验证使用Symfony2
sha512
编码生成和存储的密码。
我可以检索hash
和salt
就好了但是当使用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使用的方式相匹配?
答案 0 :(得分:6)
Symfony使用sha512进行5000次迭代。
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"));
答案 1 :(得分:1)
你好可能会对某人有用。 这是我的实时网站的代码的一部分。
https://gist.github.com/konstantinzolotarev/deec71876739f8bf1058
答案 2 :(得分:0)
检查Pbkdf2PasswordEncoder源代码以查看默认值。另请注意,Symfony默认会执行base64_encode