2016-01-10 1 views
0

Je suis en train de hachage mes mots de passe dans le modèle utilisateur avec crypto.PBKDF2 mais ma méthode est ValidatePassword à défaut, à l'exception suivanteerreur binding.PBKDF2 lorsque les mots de passe de hachage de

retour binding.PBKDF2 (mot de passe, le sel , itérations, keylen, digest, callback);

Ceci est l'erreur complète

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) 

Ce sont les méthodes pertinentes

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; 
}; 

Voici un lien vers le code complet: Repo

Répondre

1

Votre code est un peu déroutant, il définit une variable à une fonction asynchrone, et essaye en quelque sorte d'utiliser cela dans la fonction?

crypto méthodes ont un rappel où la clé générée est le deuxième argument, ce qui est généralement comment vous les utilisez

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; 
}; 

Notez que vos méthodes ne fonctionne que setPassword et validatePassword pour une instance qui est probablement très bien pour tester, mais si vous voulez plus d'un utilisateur, vous avez probablement besoin d'une base de données pour contenir ces valeurs, et ne pas simplement les assigner à this.

L'erreur que vous obtenez est parce que vous essayez de passer le résultat renvoyé des fonctions asynchrones à new Buffer, et non les clés générées

+0

J'ai ajouté votre code et j'ai modifié la question en conséquence. J'ai également changé la méthode pbkdf2Sync mais l'erreur existe toujours @adeneo – Greevman

+0

@MultiplisJoseph - essaye au moins d'enlever le mot-clé 'new' devant cette fonction dans la dernière partie. – adeneo

2

Je sais que tard, mais si quelqu'un est toujours confronté à ce problème , c'est ce que j'ai fait, et cela a résolu mon problème.

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; 
};