nodejsのbcrypt(1):bcryptの特徴と応用

3827 ワード

最近はサイトを書き換えて、バックエンドのnodejs+mongoDB.ユーザーが登録するこのブロックには、bcrypt暗号化パスワードを採用し、JWT認証が付与されたソリューションがあります.この詳しくはbcryptです.
bcryptの特徴
  • 塩を加える
  • レインボー・テーブルなどのクラック技術は、すべてのパスワードが同じ形式でハッシュ・暗号化されている場合にのみ有効であり、bcryptはランダムに塩を加えてからハッシュを防ぐ方法を採用する.
  • スローハッシュ
  • 塩のハッシュはまだ暴力的に解読される可能性があるので、bcryptは、ハッシュ関数の遅い度合いを決定することができる独自のパラメータを持っています.理想の速度は:
  • ユーザは
  • を感じられません.
  • 暴力的に解決しようとする攻撃者は耐えられない.
  • nodejsの中のbcrypt
    以前のプロジェクトではbcrypt-nodejsを使用していましたが、このプロジェクトはnode.bcrypt.jsから改善され、後者の依存性が多すぎる空間を占有する欠点を主に最適化しました.
    しかし、前者はもはやメンテナンスされていません.
    bcryptプロジェクトでの応用
    ユーザー登録登録ケース(nodejs+mongoDB):
  • ユーザが登録するとき、preフック関数を利用して、パスワードを暗号化して保存します.
  • ユーザがログインすると、次のようにSchema methodのペアが定義されます.
  • server/models/user.js
    const bcrypt = require('bcryptjs')
    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    
    const UserSchema = new Schema(
      {
        username: ...
        ... ...
      },
      {timestamps: true}
    )
    
    //     ,   save()      
    UserSchema.pre('save', function (next) {
      const user = this
      //     “    ”
      const SALT_FACTOR = 10
      //      
      bcrypt.genSalt(SALT_FACTOR, function (err, salt) {
        if (err) return next(err)
        //     
        bcrypt.hash(user.password, salt, null, function (err, hash) {
          if (err) return next(err)
          user.password = hash
          next()
        })
      })
    })
    
    UserSchema.methods.comparePassword = function (password, cb) {
      //   
      bcrypt.compare(password, this.password, function (err, isMatch) {
        if (err) { return cb(err) }
        cb(null, isMatch)
      })
    }
    
    module.exports = mongoose.model('User', UserSchema)
    
    server/appi/login.js
    ... ...
        //                          
        user.comparePassword(password, function (err, isMatch) {
                  if (err) { return console.log(err) }
                  //      
                  if (!isMatch) {
                    return res.status(403).json({
                      error: 'invaild username or password'
                    })
                  }
                  //     
                  return res.json({
                    user: { ... }
                    token: ...
                  })
                })
    ... ...
    コードは通じましたが、まだ多くの疑惑が整理されていません.たとえば:
  • 塩を加えてハッシュした後に得られた長い列の文字列にはどんな情報が含まれていますか?
  • は同じパスワードに対して、毎回塩ハッシュを加えて得られた文字列が一致しない場合、暗号化のプロセスはどのように行われますか?
  • は、パスワードに使用されているbcrypt.jsと比較する方法であり、そのパラメータには、saltが含まれていない.この過程で塩が役に立ちませんか?それとも他のところに隠しますか?
  • 次の編に書きましょう.
    更新:
    nodejsのbcrypt(2):bcrypt浅分析