【发布时间】:2014-10-03 12:35:24
【问题描述】:
我需要能够在node 中验证一些使用Symfony2 和sha512 编码生成和存储的密码。
我可以很好地检索hash 和salt,但是当使用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