簡體   English   中英

節點 bcrypt 的比較總是返回 false

[英]Node bcrypt's compare always returns false

我很難讓我的密碼成功地與使用節點的 bcrypt 進行比較。 也許我錯過了一些東西,但在創建帳戶時,我在注冊方法中執行以下操作(一些代碼縮寫):

bcrypt.genSalt(10, function(err, salt) {
               if(err) {

               }
               bcrypt.hash(user.Password, salt, function(err, hash) {
                           console.log('hashing and saving');
                           db.query(db insert code, function (error, rows, fields) {
                                    if(error) {
                                    console.log(error);
                                    res.setHeader('500', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: 0, ErrorMessage: 'Something terrible happened.'});
                                    } else {
                                    console.log('User created : ' + rows.insertId);
                                    res.setHeader('200', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: rows.insertId});
                                    }
                                    });
                           });
               });

return next();

這一切都很好。 我的數據庫有加密的密碼。 但是當用戶登錄時,我無法從 bcrypt.compare 獲得成功的結果:

db.query(get account code, function(error, rows, fields) {
         if(rows.length == 1) {
           bcrypt.compare(request.params.password, rows[0].Password, function(err,res) {
              if(err) { console.log(err.toString()); }
              if(res == true)
              {
                        response.setHeader('200', { 'Content-Type': 'x-application/json' });
                        response.send({result: true});
              } else {
                        response.setHeader('401', { 'Content-Type': 'x-application/json' });
                        console.log('invalid password');
                        response.send({result:false});
                     }
              });
         }
        });

return next();

而且我總是以無效密碼告終。 在與從數據庫中提取的內容進行比較之前,我是否需要獲取明文密碼並重新加密?

你可以跳過做bcrypt.genSalt並使用bcrypt.hash(password, 10, function(err, hash) {..});

你的比較功能對我來說似乎很好。

這對我來說很好用:

var bcrypt = require('bcrypt');

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }

    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});

我不知道你是否有和我一樣的問題,我有同樣的問題,因為我的表的長度為 45 個字符,bcrypt 比較哈希長度是否與 60 不同,它返回 false。 只需增加表格中字符的長度

我的原因是我的數據庫列沒有足夠大的 varchar 長度。 一個檢查的好地方。

bcrypt 的比較方法的參數應該是

bcrypt.compare(actual_password, encrypted_password)

代替

bcrypt.compare(encrypted_password, actual_password)

=> encrypted_pa​​ssword 應該是第二個參數。

對我來說,這只是一種爭論障礙

正確的順序

bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)

我有同樣的問題。 在將節點包從bcrypt更改為bcryptjs ,比較就像一個魅力。 由於包似乎是一個fork,功能不需要調整。

我遇到了同樣的問題,但我確定我沒有對密碼進行兩次編碼。 事情就是這樣。 bcrypt-nodejs npm 包在 v0.0.3 上,我正在使用這個版本。 我正在編寫算法以在注冊時存儲用戶密碼並在登錄時讀取用戶密碼。 前端是一個簡單的電子郵件字段輸入文本和密碼字段輸入密碼。 當我提交請求時,我在本地節點服務器上發布對https://localhost ... 的調用。 我可以記錄收到的數據,我可以看到記錄的密碼與前端插入的密碼相同。

用於存儲密碼的代碼是:

//var user.bcrypt = bcrypt.genSaltSync(10);;
var clearPwd = user.password;
user.password = bcrypt.hashSync(clearPwd);//, user.bcrypt);
log4.debug("hashSyncked: "+ user.password);
db.userSave(user, cb);

用於讀取和比較密碼的代碼是:

log4.debug('compare '+pwd+' with saved on db for user %j', userDoc.password);
var okPwd = bcrypt.compareSync(pwd, userDoc.password);

所以,我看到了散列密碼,它被記錄為一個字符串,如 $ert3435tF.02ri 等......

但是每次我使用注冊時的相同密碼登錄時, okPwd總是錯誤的。 為什么?

即使我取消注釋注釋代碼!

更新我找到的解決方案是關於方法的。 密碼不應該這樣存儲和讀取,這太……粗魯了! 這里提到了正確的方法當心! 該指南有錯誤。 bcrypt.hash(...) 函數需要 2 個對象參數和 2 個回調! 最后一個是在散列過程結束時調用的,第一個被調用來跟蹤散列過程。 我把它設為空,一切都很好。 我承認我犯了另一個錯誤:我使用 bcrypt-nodejs 包而不是 brcrypt。

只需修改數據庫中分配給密碼字段的字符長度,可能生成的哈希值大於該字段可以支持的值

我的哈希以 $2y 開頭,它必須以 $2b 開頭

該庫支持 $2a$ 和 $2b$ 前綴 bcrypt 哈希。 $2x$ 和 $2y$ 哈希是專門為 John the Ripper 開發的 bcrypt 實現。 理論上,它們應該與 $2b$ 前綴兼容。

在比較功能中很容易混淆順序;)

bcrypt.compare(user_entered_password, database_encrypted_password)

這對我有用。

var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync();

bcrypt.hash('mypassword', salt, function(err, hash){
    if(err) throw err;

    bcrypt.compare('mypassword', hash, function(err, result) {
      if (err) { throw (err); }
      console.log(result);
    });

});

我遇到了同樣的問題,對我來說,解決方案是修復前端的錯字。 我正在從我的表單中發送“密碼”並期待“密碼”。 然后 bcyppt 以某種方式對返回的未定義值進行哈希處理,這就是 compare() 總是返回 false 的原因。

希望這對某人有幫助!

對我有用的另一種可能的解決方案是,如果在您的用戶模型中,您將其放在密碼字段下。

lowercase: true,

我碰巧從另一個領域復制了這個。 當我刪除它時,問題就消失了。

我刪除了我的用戶並重新創建了它並這樣做了

const isMatch = await bcrypt.compare(password, user.password);
console.log(user.password, isMatch);
if (!isMatch) {
  return res.status(400).json({
    msg:
      "Sorry, your password was incorrect. Please double-check your password.",
  });

在創建用戶時,我這樣做了

const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);

在比較函數中,您不需要生成新的哈希,請執行以下操作:

async function Login(email, password) {
  const user = await this.service.getByEmail(email);

  const passwordBd = user.user_password;

  const matching = await bcrypt.compare(password, passwordBd);

  console.log(matching); //true
};

就我而言,我將哈希作為命令行參數傳遞給節點程序 - 僅用於測試:

node admin/bcrypt.js password $2b$10$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm

哈希以$2b$10$/開頭; $2$1被解釋為位置參數並評估為空值,因此被比較的值與我傳入的值不同。用\轉義$符號解決了這個問題:

node admin/bcrypt.js password \$2b\$10\$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm

我對 postgresql 有同樣的問題,但應該總是一樣的。

我只需要修剪我的數據庫結果:

bcrypt.compare(
    req.body.password,
    String(user.PASSWORD).trim()
)

我不知道你是否和我一樣,我有同樣的問題,因為我的表有 35 個字符的長度,如果 hash 長度與 60 不同,則 bcrypt 比較它返回 false。 只需增加表格中字符的長度

那是由於密碼長度為 45,增加它並解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM