記事ディレクトリ
簡単な説明
重要: プロジェクトのデータベースに保存されているパスワードは暗号化する必要があり、不可逆的なアルゴリズムを使用して暗号化する必要があります。
ステップ 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()方法