如何使用nodejsvalidationSymfony2 sha512密码

我需要能够在nodevalidation一些用sha512编码使用Symfony2生成和存储的密码。

我可以检索hashsalt就好了,但使用crypto我不能pipe理生成一个哈希使用盐匹配存储在数据库中的一个。

Symfony security.yml

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

散列存储在数据库中

 6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ== 

储存在DB中的盐

 qu7rjvaietws8kg4cgsggksookwsws8 

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

我还尝试了Symfony 2 MessageDigestPasswordEncoder使用的5000次迭代,并将原始密码与salt合并为symfony raw_password{salt}但没有成功。

如果我使用pbkdf2Sync生成一个长度为40的密钥(按照symfony的默认值),然后使用它来更新一个用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")); 

生成的散列的大小和格式与存储在数据库中的散列的大小相匹配,但是它们不匹配是我的问题的值。 我也试着dynamic生成多个迭代值,没有任何运气。

产量

 6zxwRZc4EPXKxQes9avs0ZyCRFkC4dtpXrT983ML8VLvv9WhRnAi282bwuFuj3LHPQBGmqD1BfCLDUXGdHIjZQ== 5QPz3zXwhak/bTD2S9IFEEFmiJ8q/fqIlSF6cWin7dqmh92EFNXjw/FLtQw7NX3LVehwcXKjfypo2EhJxiLouQ== w9+8xjklvGq9CuiqY8tEoxEetLV9lbhLJ/KaFQEooUFJrGT9/EdsVd/sSRJ+DXjsH4RQeaqsmftmuzLPgVv5MA== 

我怎样才能生成散列,使其符合Symfony 2使用的方式?

Symfony使用sha512进行5000次迭代。

  1. 他们连接原始密码和用户的盐,生成一个新的盐
  2. 他们用上面的数据产生一个开始的散列。
  3. 在每次迭代之前,使用当前在步骤1中生成的散列+新salt更新之前的散列。

在节点中,在每次迭代中,您应该将之前的哈希消化为二进制文件,并在最后的消化文件中将其作为base64来模拟Symfony的function。

举个例子:

 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")); 

你好,可能会对某人有用。 这是我的生活网站的代码的一部分工作。

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

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