【问题标题】:nodejs pbkdf2sync Not a buffer errornodejs pbkdf2sync 不是缓冲区错误
【发布时间】:2015-05-21 14:45:20
【问题描述】:

突然在我的控制台中它开始出现错误,并且它已经运行了好几天没有任何变化。请指教。

/node_modules/mysql/lib/protocol/Parser.js:82
        throw err;
              ^
TypeError: Not a buffer
    at TypeError (native)
    at pbkdf2 (crypto.js:607:20)
    at Object.exports.pbkdf2Sync (crypto.js:590:10)


    crypto: require("crypto"),

    encrypt: function(password) {
        var salt = this.getSalt(password, this.constructor.GUID);
        return {salt: salt, password: this.getEncrypted(password, salt)};
    },

    getSalt: function(password, GUID) {
        return this.crypto.createHash("sha256").update(password + "|" + GUID).digest("hex")
    },

    getEncrypted: function(password, salt) {
        return this.crypto.pbkdf2Sync(password, salt, 4096, 512, "sha256").toString("hex");
    },

    verifyPassword: function(user, password) { //var salt = this.getSalt("test@test.com|" + this.constructor.GUID); console.log("salt: " + salt); console.log("password: " + this.getPassword("HUG2015", salt));
        return this.crypto.pbkdf2Sync(password, user.salt, 4096, 512, "sha256").toString("hex")  == user.password; //test
    },

    generateAuthToken: function() {
        return this.crypto.randomBytes(64).toString("hex");
    }

编辑:用法

        getUser: function(emailAddress, password) {
            var self = this;
            this.connection.query("SELECT * from admin WHERE emailAddress = ?", [emailAddress], function(error, rows, fields){
                if(error) {
                    self.onFault({status: 500, body: error});
                } else {
                    if(rows.length == 1) {
                        self.verifyPassword(rows[0], password)
                    } else {
                        self.onFault({status: 401, body: {}});
                    }
                }
            });
        },

        verifyPassword: function(user, password) {
            var self = this;
            try {
                if(this.authenticationProxy.verifyPassword(user, password)) {
                    this.setAuthToken(user, this.authenticationProxy.generateAuthToken());
                } else {
                    this.onFault({status: 401, body: {}});
                }
            } catch(exception) {
                this.onFault({status:500, body: exception});
            }
        },

【问题讨论】:

  • 我正在使用用法进行编辑
  • 这没有多大帮助。你说的是哪条线?你能展示示例输入吗?你能在你自己的代码之外创建一个完整的例子吗?
  • hmmm尽我所能,错误在return this.crypto.pbkdf2Sync(password, salt, 4096, 512, "sha256").toString("hex");
  • 至少,你能告诉我这个策略是好的还是我应该在这里改变一些不正确的东西?
  • 确保密码不为空。

标签: javascript node.js encoding cryptography


【解决方案1】:

我的猜测是,如果 password 是一个数字,则会抛出“not a buffer”。在 crypto.js 中有一个 toBuf 调用,它试图将 password 更改为缓冲区(除非它已经是缓冲区)但只转换字符串。

你可以尝试两件事:

1) 确保密码(传递给crypto.pbkdf2Sync)是一个字符串

2) 或者自己转换成缓冲区 -> 传递new Buffer(password, 'binary')

【讨论】:

  • @user2727195 如果有帮助,请接受答案:D
  • 我没有尝试过,因为它来得太晚了,但看起来很有希望,但答案被接受了。
  • 我也有同样的问题,但是密码肯定不是数字。这种情况下为什么会出现这个错误?
  • 如果不看您的代码示例就很难判断 :)
【解决方案2】:

如果此代码根本没有更改,但突然无法正常工作,那是因为其中一个调用库或您所做的其他更改受到干扰。

(或者正在使用新的节点版本,但我怀疑这是你的问题)。

不推荐您使用的模式:

mysingleton = {

crypto: require('crypto'),
...

}

这是因为任何通过匿名函数的回调都会丢失你的 'this' 对象。

同样在 node.js 中,您不需要这种模式,因为 mode.js 中的每个文件都保存在单独的命名空间中并受 module.exports 保护。

您可以通过以下方式摆脱对“this”的引用,以快速检查“this”是否是罪魁祸首:

var
   c = require('crypto');

mysingleton = {

// delete the crypto definition here
// crypto: ...,
...
encrypt: function(password) {
    // note elimination of this below
    var salt = mysingleton.getSalt(password, this.constructor.GUID);
    return {salt: salt, password: this.getEncrypted(password, salt)};
},
...
getSalt: function(password, GUID) {
    return c.createHash("sha256").update(password + "|" + GUID).digest("hex")
},
...
}

如果这样可以解决问题,我建议您了解更多有关您的框架/系统的最佳推荐模式的背景知识。

【讨论】:

    【解决方案3】:

    在我的例子中,我试图将 JSON 对象直接发送到函数。

    { token: "abc" }
    

    我将函数的输入字符串化,一切正常。

    JSON.stringify({ token: "abc" })
    

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2023-03-18
      • 1970-01-01
      • 2014-06-26
      • 2022-06-13
      • 2019-04-28
      • 2016-06-07
      • 2016-07-17
      • 1970-01-01
      相关资源
      最近更新 更多