如何使用Node.js验证Python的Passlib创建的加密哈希?

时间:2015-04-01 13:03:56

标签: python node.js security hash pbkdf2

我有一个用Python编写的后端应用程序,由我网站的内容管理员使用。使用passlib's pbkdf2_sha512函数对用户密码进行哈希处理。我开始开发前端应用程序,为了UX的原因,我决定使用带有React的nodejs。

现在我的问题是我无法弄清楚如何使用nodejs验证我的用户身份验证密码是否被passlib哈希。 Passlib的实现对我来说似乎太具体了,我并没有真正进入加密的东西来解决它。

我有MCF所以我知道算法和摘要类型,盐,迭代次数和密钥长度。如何从节点中的passlib验证此输出?我是否应该选择两种平台更好地支持的另一种算法?

3 个答案:

答案 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);

希望有所帮助。