18

ノードを使用してパスワードを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();

そして、私はいつも無効なパスワードになってしまいます。データベースから取り出したものと比較する前に、クリアテキストのパスワードを取得して再暗号化する必要がありますか?

4

16 に答える 16

17

スキップして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);
    });
});
于 2013-02-10T10:33:53.167 に答える
8

あなたが私と同じかどうかはわかりません.テーブルの長さが45文字で、ハッシュの長さが60と異なる場合、bcryptはfalseを返すため、同じ問題が発生しました. テーブル内の文字の長さを増やすだけです

于 2017-01-02T18:54:48.520 に答える
1

これと同じ問題がありましたが、パスワードを 2 回エンコードしていないことは確かです。これが事です。bcrypt-nodejs npm パッケージは v0.0.3 にあり、このバージョンを使用しています。登録時にユーザーパスワードを保存し、ログイン時にユーザーパスワードを読み取るアルゴリズムを作成しています。フロントエンドは、メール フィールドにテキストを入力し、パスワード フィールドにパスワードを入力するシンプルなものです。リクエストを送信すると、ローカル ノード サーバーのhttps://localhost ...への呼び出しを POST します。受信したデータをログに記録でき、ログに記録されたパスワードがフロントエンドに挿入されたパスワードと同じであることを確認できます。

パスワードの保存に使用されるコードは次のとおりです。

//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は常に false になります。なんで?

コメントされたコードのコメントを外しても!

更新 私が見つけた解決策は、メソッドに関するものでした。パスワードをそのように保存して読み取るべきではありません。あまりにも...失礼です!! 正しい方法はここに記載されています注意してください!そのガイドラインには誤りがあります。bcrypt.hash(...) 関数には、2 つのオブジェクト パラメータと 2 つのコールバックが必要です。最後の 1 つはハッシュ プロセスの最後に呼び出されるもので、最初の 1 つはハッシュ プロセスを追跡するために呼び出されます。それをヌルにすると、すべてうまくいきます。私は別の間違いを犯したことを認めます.brcryptの代わりにbcrypt-nodejsパッケージを使用しました.

于 2016-09-24T08:05:23.117 に答える
0

比較関数では、新しいハッシュを生成する必要はありません。次のようにします。

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
};
于 2021-02-09T17:46:30.837 に答える
0

これは私にとってはうまくいきます。

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

});
于 2015-08-13T08:31:41.413 に答える
0

私にとってうまくいった別の解決策は、ユーザーモデルでパスワードフィールドの下に置く場合です。

lowercase: true,

たまたまこれを別のフィールドからコピーしました。削除すると、問題はなくなりました。

于 2020-06-14T16:26:35.003 に答える
-2

これは、パスワードの長さが 45 だったことが原因でした。それを長くすると、問題が解決します。

于 2022-02-10T10:59:41.873 に答える