如何使用nodejsvalidationSymfony2 sha512密码
我需要能够在node
validation一些用sha512
编码使用Symfony2
生成和存储的密码。
我可以检索hash
和salt
就好了,但使用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中生成的散列+新
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