0

我有一个存储此 node.js 代码生成的密码的 mongodb 服务器:

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)

你有什么想法?

4

1 回答 1

1

在你的节点代码中,你有这个:

var salt = new Buffer(this.salt, 'base64');

这假定这是一个包含盐this.salt的 Base64编码字符串。随后将其解码为Buffer. 所以,salt是一个(二进制)缓冲区。

在你的 Python 代码中,你有这个:

salt = base64.b64encode(b'salt') 

这需要二进制字符串salt并对其进行 Base64 编码。所以,salt是一个(Base64 编码的)字符串。

注意 Node(二进制缓冲区)和 Python(Base64 编码的字符串)之间的类型不匹配?

相反,在您的 Python 代码中使用它:

salt = b'salt'

或者允许 Python 代码将 Base64 编码的字符串作为盐,并对其进行解码:

salt = base64.b64decode('c2FsdA==')
于 2016-06-22T09:30:04.907 回答