我有一个mongodb服务器,用于存储此node.js代码生成的密码:
encryptPassword(password, callback) {
if (!password || !this.salt) {
return null;
}
var defaultIterations = 10000;
var defaultKeyLength = 64;
var salt = new Buffer(this.salt, 'base64');
if (!callback) {
return crypto.pbkdf2Sync(password, salt, defaultIterations, defaultKeyLength)
.toString('base64');
}
return crypto.pbkdf2(password, salt, defaultIterations, defaultKeyLength, (err, key) => {
if (err) {
callback(err);
} else {
callback(null, key.toString('base64'));
}
});
}
但是身份验证阶段是由带有纯文本密码的python脚本执行的,并且应该重新构造node.js的相同密码。 我试图使用来自django python模块的hashlib和pbkdf2来做到这一点,但结果不匹配。 hashlib脚本是:
salt = base64.b64encode(b'salt')
hashedPassword = hashlib.pbkdf2_hmac('sha1', b'password', salt, 10000, 64)
encodedPassword = base64.b64encode(res)
你有什么想法吗?
答案 0 :(得分:1)
在您的节点代码中,您有:
var salt = new Buffer(this.salt, 'base64');
这假定this.salt
是包含salt的Base64 编码的字符串。随后将其解码为Buffer
。因此,salt
是(二进制)缓冲区。
在你的Python代码中,你有这个:
salt = base64.b64encode(b'salt')
这将采用二进制字符串salt
并对其进行Base64编码。因此,salt
是(Base64编码的)字符串。
请注意Node(二进制缓冲区)和Python(Base64编码的字符串)之间的类型不匹配?
相反,请在Python代码中使用它:
salt = b'salt'
或者允许Python代码将Base64编码的字符串作为salt,并对其进行解码:
salt = base64.b64decode('c2FsdA==')