散列密码Node.JS时出现binding.PBKDF2错误

时间:2016-01-10 00:59:15

标签: javascript node.js authentication encryption pbkdf2

我正在尝试使用crypto.PBKDF2在用户模型中哈希我的密码,但我的validatePassword方法失败并出现以下异常

  

返回binding.PBKDF2(密码,盐,迭代,keylen,摘要,回调);

这是完整的错误

crypto.js:562
return binding.PBKDF2(password, salt, iterations, keylen, digest, callback);
               ^
TypeError: Not a buffer
    at TypeError (native)
    at pbkdf2 (crypto.js:562:20)
    at Object.exports.pbkdf2Sync (crypto.js:553:10)
    at new <anonymous> (c:\Users\Joseph\news-trends\models\Users.js:25:23)
    at Object.<anonymous> (c:\Users\Joseph\news-trends\models\Users.js:24:39)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (c:\Users\Joseph\news-trends\app.js:17:1)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

这些是相关的方法

UserSchema.methods.setPassword = function(password){
    var self = this;

    crypto.randomBytes(16, function(err, salt){
        if(err){ throw err; }
        self.salt = salt.toString('hex');
    });

    crypto.pbkdf2(password, this.salt, 1000, 64, function(err, hash){
        if(err){ throw err;}
        self.hash = hash.toString('hex');
    });
};
UserSchema.methods.validatePassword = new function(password){
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    return this.hash = hash;
};

以下是完整代码的链接:Repo

2 个答案:

答案 0 :(得分:2)

我知道它已经很晚了,但如果有人还在面对这个问题,那就是我所做的,它解决了我的问题。

UserSchema.methods.setPassword = function(password){
    this.salt = crypto.randomBytes(16).toString('hex');
    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
}

UserSchema.methods.validatePassword = function(password){
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    return this.hash === hash;
};

答案 1 :(得分:1)

您的代码有点令人困惑,它将变量设置为异步函数,并以某种方式尝试在函数内部使用它?

crypto方法有一个回调,其中生成的键是第二个参数,这就是你通常使用它们的方式

UserSchema.methods.setPassword = function(password){

    var self = this;

    crypto.randomBytes(16, function(err, salt){
        if(err){ throw err; }
        self.salt = salt.toString('hex');
    });

    crypto.pbkdf2(password, this.salt, 1000, 64, function(err, hash){
        if(err){ throw err;}
        self.hash = hash.toString('hex');
    });
}

UserSchema.methods.validatePassword = function(password){
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    return this.hash === hash;
};

请注意,您的setPasswordvalidatePassword方法仅适用于一个实例,这可能适用于测试,但如果您需要多个用户,则可能需要一个数据库来保存这些值,而不只是将它们分配给this

您获得的错误是因为您尝试将返回的结果从异步函数传递给new Buffer,而不是生成的密钥