暗号化と検証用の Express+mongoose データベース ストレージ パスワード

簡単な説明

重要: プロジェクトのデータベースに保存されているパスワードは暗号化する必要があり、不可逆的なアルゴリズムを使用して暗号化する必要があります。

ステップ 1: プロジェクトを作成する

express自動ビルド ツールを使用してテスト プロジェクトを直接作成します。
ここに画像の説明を挿入
次に、プロジェクト ディレクトリを入力して依存関係をインストールします。
ここに画像の説明を挿入
マングースモジュールをインストールする
ここに画像の説明を挿入

キーポイント: bcryptjs モジュールをインストールする

bcryptjs模块Nodejsの1つです字符串加盐(slat)加密模块。通常のmd5暗号化は不可逆ですが、md5は辞書攻撃を利用して暗号化情報を取得できるため、元の情報に追加する必要があります。本質も文字列です。再度md5暗号化を行う必要盐(slat)あります辞書攻撃を防ぐことができますが、これらの操作を実装する必要はありません。bcryptjs モジュールはすでにそれらを実装しているので、それらのいくつかを使用するだけで済みます。字符串加密的信息和盐进行拼接

を使用してbcryptjs モジュールをインストールしますnpm i bcryptjs
ここに画像の説明を挿入

ステップ 2: モデル オブジェクトとインターフェイスを作成する

ファイルはプロジェクトのルート ディレクトリに作成しますmodels.js。場所は重要ではなく、気軽に作成できます。
ここに画像の説明を挿入

モデルモジュールを書く

ここに画像の説明を挿入
メインコード(上記のコード)

const mongoose = require('mongoose')
const bcryptjs = require('bcryptjs')
// 连接数据库
mongoose.connect('mongodb://127.0.0.1/bcrypt', err => {
    
    
    if (!err) {
    
    
        console.log('数据库连接成功');
    }
})
// 定义schema
const userSchema = mongoose.Schema({
    
    
    username: String,
    password: {
    
    
        type: String,
        set(val) {
    
       // 每次对数据库进行修改或插入时都会执行set
            return bcryptjs.hashSync(val) // 对入库的密码进行加密
        }
    }
})
// 定义model
const userModel = mongoose.model('user', userSchema)
// 暴露model
module.exports = {
    
    
    userModel
}

登録ログイン インターフェイスを作成する

ここに画像の説明を挿入
メインコード(上記のコード)

var {
    
     userModel } = require('./models')  // 引入userModel
var bcryptjs = require('bcryptjs')  // 引入bcryptjs模块

app.post('/register', async (req, res) => {
    
    
  // 假设已经对数据进行过验证, 因为在model中定义了set方法所以这里直接入库
  await userModel.create(req.body)
  res.send('ok')
})

app.post('/login', async (req, res) => {
    
    
  let username = req.body.username
  let password = req.body.password
  let user = await userModel.findOne({
    
     username })
  if (!user) {
    
    
    return res.send('没有这个用户!')
  }
  // 使用bcryptjs.compareSync方法进行验证,第一个参数是要验证的字符串,第二个参数是加密过的字符串
  if (!bcryptjs.compareSync(password, user.password)) {
    
    
    return res.send('密码错误!')
  }
  res.send('登录成功!')
})

ステップ 3: 効果をテストする

node ./bin/www起動項目を入力します
ここに画像の説明を挿入

postman を使用して登録インターフェイスをテストする

ここに画像の説明を挿入
パスワードが暗号化されていることがわかります
ここに画像の説明を挿入

ログインインターフェイスのテスト

ここに画像の説明を挿入
ここに画像の説明を挿入
ログインインターフェースに問題がないことがわかります。

要約する

主に 2 つの方法が使用されますbcryptjs模块
bcryptjs.hashSync(val)暗号化された文字列を生成し
bcryptjs.compareSync(val, hasval)、パラメータ 1 からパラメータ 2 が暗号化されているかどうかを確認します
。これら 2 つの方法の原理を理解したい場合は、Baidu を参照してください。

フィールドオブジェクトは定義時にSchema对象変更可能set()方法

おすすめ

転載: blog.csdn.net/qq_45458749/article/details/125759337