t_wの輪郭

Feedlyでフォローするボタン
認証ハッシュ化コールバック関数crypto.timingSafeEqualcrypto.pbkdf2暗証語『Username & Password Tutorial: Verify Password』利用者名LocalStrategyPassport.jssha256
passport.use(new LocalStrategy(function verify(username, password, cb) {
  db.get('SELECT rowid AS id, * FROM users WHERE username = ?', [ username ], function(err, row) {
    if (err) { return cb(err); }
    if (!row) { return cb(null, false, { message: 'Incorrect username or password.' }); }

    crypto.pbkdf2(password, row.salt, 310000, 32, 'sha256', function(err, hashedPassword) {
      if (err) { return cb(err); }
      if (!crypto.timingSafeEqual(row.hashed_password, hashedPassword)) {
        return cb(null, false, { message: 'Incorrect username or password.' });
      }
      return cb(null, row);
    });
  });
}));

『Username & Password Tutorial: Verify Password』より


何をしているコードか

  1. dbから与えられた利用者名と一致する利用者情報(利用者名, ハッシュ化された暗証語)を取り出す。
  2. 与えられた暗証語crypto.pbkdf2sha256ハッシュ化する。
  3. crypto.timingSafeEqualで1.と2.で得られたハッシュ化された暗証語を比較し、一致していれば利用者情報をcallback関数(cb)で返す
あれutilライブラリのpromisify使うとasync/await使えるから便利

あれ

2022/4/20 18:04:00

たった14行のコード(Passport.jsのLocalStrategyで利用者名と暗証語を認証するコード)が何をしているか理解するのに必要な前提知識が多すぎる。理解できるまで2時間ほどかかった。セキュリティは大変だ。というか、なんの説明もなしに、「はい、これでやってくださいね〜〜」って投げ出される辛さよ。

Qiitaとか個人ブログとかに「コピペでOK」みたいなコードが載ってたりするけど、なんかOKじゃない臭いがしたので泣きながら公式の情報読んでる(辛い)。