我有一个用Python编写的后端应用程序,由我网站的内容管理员使用。使用passlib's pbkdf2_sha512函数对用户密码进行哈希处理。我开始开发前端应用程序,为了UX的原因,我决定使用带有React的nodejs。
现在我的问题是我无法弄清楚如何使用nodejs验证我的用户身份验证密码是否被passlib哈希。 Passlib的实现对我来说似乎太具体了,我并没有真正进入加密的东西来解决它。
我有MCF所以我知道算法和摘要类型,盐,迭代次数和密钥长度。如何从节点中的passlib验证此输出?我是否应该选择两种平台更好地支持的另一种算法?
答案 0 :(得分:2)
我们有完全相同的问题,但切换到sha512crypt不是一个选项。在我们的例子中,密码是使用flask-security生成的。下面的示例包括常规passlib和flask-security哈希,它首先生成带有秘密盐的HMAC并将其用作pbkdf2-sha512密码。请参阅下面的代码。
来源是GitHub:https://github.com/badzong/node-verify-flask-security-passwords
first_name
答案 1 :(得分:1)
好的,我转而使用sha512_crypt,为名为sha512crypt-node的节点找到了一个很好的库。 README本身包含Python和Node的示例,正是我需要的。这是ppl的一个小例子。使用这些平台:
的Python:
from passlib.hash import sha512_crypt
orig = "password"
h = sha512_crypt.encrypt(orig)
print("hash", h)
# h for eg. is $6$rounds=100000$5YnTXatKh4b1pLjp$3QQjVIfjrbiTakj.wkaw1woAcFiPRAjJP2U/b3BiGW4m8OvI8x0tgw1bb63dNQWMUl1uYNDBcTO3tWgrJ6eHh1
okay = sha512_crypt.verify(orig, h)
print("verified", okay)
节点:
var sha512crypt = require("sha512crypt-node").sha512crypt;
// origHash is the hash generated by passlib
var origHash = "$6$rounds=100000$5YnTXatKh4b1pLjp$3QQjVIfjrbiTakj.wkaw1woAcFiPRAjJP2U/b3BiGW4m8OvI8x0tgw1bb63dNQWMUl1uYNDBcTO3tWgrJ6eHh1",
parts = origHash.split('$'),
rounds = parts[2],
salt = '$' + parts[1] + '$' + rounds + '$' + parts[3],
password = "password";
var hash = sha512crypt(password, salt);
console.log("verified", hash === origHash);
答案 2 :(得分:0)
遗憾的是,上述解决方案都不适用于我(passlib 1.7.4)。我最终编写了自己的小节点模块。如果有人仍然坚持这个,请随意使用 node-passlib
示例:
import nodePasslib from 'node-passlib';
// python-passlib PBKDF2-SHA512 hash
const pbkdf2Hash = '$pbkdf2-sha512$25000$JKSU8r63VgrBmHMO4RwjRA$bUL/owmBl8slaj.fjONmdRijzOs4Lo6EwbKtoA6EPX1hs1BCdg3JRjfkR3WX5/mZ4cIhtJhFVFxrLlq1lHfpQw';
nodePasslib.verify('yourpassword', pbkdf2Hash);
// true
nodePasslib.verify('wrongpassword', pbkdf2Hash);
// false
默认密钥长度设置为 64。如果您使用 SHA256 编码散列,则需要指定不同的密钥长度:
nodePasslib.verify('yourpassword', pbkdf2Hash, 32);
希望有所帮助。