2015-10-15 73 views
0

這是我如何散列並將我的密碼存儲在數據庫中。使用節點j無法驗證Express中的散列密碼

NEWUSER功能

var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync(password, salt); 
var query="INSERT into user(email,firstname,lastname,logintime,gender,password) VALUES('"+email+"','"+firstname+"','"+lastname+"','"+logintime+"','"+gender+"','"+hash+"')"; 

這是我如何檢索和檢查,以驗證

VALIDATE功能

var query = "SELECT password from user where email='" + email + "'"; 
connection.query(query,function(err,result){ 
    if(err) 
     { 
     console.log("ERROR:"+err.message); 
     } 
    else 
     { 
     if(result.length!==0) 

     { 

var hash=JSON.stringify(result[0].password); console.log(hash); 
    console.log(bcrypt.compareSync(password,hash)); 
if(bcrypt.compareSync(password, hash)) { callback(err, result); } 

這始終顯示錯誤,但如果我這樣做是顯示預期結果

var hash = bcrypt.hashSync("sacjap", 8); 
      //var hash=JSON.stringify(result[0].password); 
      console.log(hash); 
      console.log(bcrypt.compareSync(password,hash)); 
      if(bcrypt.compareSync(password, hash)) 
       { 
      callback(err, result); 
       } 

所以問題是,每當我從數據庫中得到的密碼不起作用。 PLZ幫助

回答

0

首先,我的答案是基於我發現這裏的文檔上: https://github.com/davidwood/node-password-hash

看來,密碼哈希模塊試圖調用你所提供的第二個參數的「分裂」功能'verify'函數,假設它是一個字符串(JavaScript String split function on MDN)。我認爲你應該檢查'result'變量的類型,它在我看來就像數據庫返回的更復雜的查詢結果對象。您提供的代碼不會提供有關您在此處使用的連接類型的更多信息,因此我無法給出更具體的答案。我的方法是找出如何從'result'變量中得到一個簡單的字符串,然後代表可以交給'verify'的散列密碼。這只是一個瘋狂的猜測,我希望這個小小的提示可以幫助你解決你的問題。

備註:您用於密碼散列的模塊似乎已被棄用,也許您應該尋找替代方案。

+0

感謝您的幫助。是的,你是對的。所以我改變了我的代碼: –

+0

var hash = JSON.stringify(result [0] .password); \t \t \t \t console.log(hash); \t \t \t \t console.log(bcrypt.compareSync(password,hash)); \t \t \t \t如果(bcrypt.compareSync(密碼,哈希值)) \t \t \t \t \t { \t \t \t \t回調(ERR,結果); \t \t \t \t \t} –

+0

但crypt.compare顯示錯誤,即使當我把正確的密碼。有什麼想法嗎? –