Gil*_*esC 1 hash pbkdf2 node.js symfony
我需要能够验证在node
其中产生并使用存储一些密码Symfony2
与sha512
编码.
我可以检索hash
并且salt
正常但是在使用时crypto
我无法使用与数据库中存储的盐匹配的salt来生成哈希.
Symfony security.yml
security:
encoders:
"FOS\UserBundle\Model\UserInterface": sha512
Run Code Online (Sandbox Code Playgroud)
哈希存储在DB中
6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
Run Code Online (Sandbox Code Playgroud)
盐存储在DB中
qu7rjvaietws8kg4cgsggksookwsws8
Run Code Online (Sandbox Code Playgroud)
由于我正在使用的节点端有一个salt,crypto.pbkdf2Sync
配置中没有设置迭代,看起来Symfony的默认值是1000.但是默认长度是40但是存储的散列长度是128,所以使用128作为长度(试了40但没有成功).
我也尝试过Symfony 2使用的5000次迭代MessageDigestPasswordEncoder
,并将原始密码与salt合并,因为symfony raw_password{salt}
没有成功.
如果我使用pbkdf2Sync
生成长度的密钥40
(根据symfony默认值)然后使用它来更新哈希生成,我也可以获得足够长的base64crypto.createHash
var hash = user.password;
var salt = user.salt;
console.log(hash);
console.log(crypto.pbkdf2Sync("password", salt, 1000, 128 >> 1, "sha512").toString("base64"));
Run Code Online (Sandbox Code Playgroud)
生成的哈希大小和格式与存储在数据库中的大小匹配,但它们与我的问题值不匹配.我还尝试了动态生成的多个迭代值,没有任何运气.
产量
6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ==
5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ==
w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA==
Run Code Online (Sandbox Code Playgroud)
如何生成散列,使其与Symfony 2使用的方式相匹配?
Symfony使用sha512进行5000次迭代.
salt
在步骤1生成的当前散列+ new更新先前的散列.在节点中,在每次迭代时,您应该将先前的散列消化为二进制,并在最终消化中将其消化为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"));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1004 次 |
最近记录: |