##ハッシュ化のメリット
・パスワードなどをデータベースに保存する時、プレーンテキストのまま保存すると脆弱性に繋がる。
・ハッシュ化したメッセージダイジェストから、元のメッセージを復元することは困難
→「インクリプション」…元のメッセージをとっておいて、それをハッシュ化したら同じハッシュ値になるかチェックすることで、同一性を確認する仕組み
##bcryptパッケージ
bcryptというnpmパッケージを利用すると、プレーンテキストをハッシュ化することができる。
・bcryptパッケージの使い方
const bcrypt = require('bcryptjs')
const myFunction = async() => {
const password = "password1234"
const hadhedPassword = await bcrypt.hash(password, 8) //第一引数:ハッシュ化したい値、第二引数:roundをかける回数。公式推奨は8回
console.log(password) //元のパスワードを表示
console.log(hassedPassword) //ハッシュ化されたパスワードを表示
//元のパスワードとハッシュ化されたパスワードを比較し、同じものであるか確認
const isMarch = await bcrypt.compare('password', hashedPassword)
}
myFunction()
##値をハッシュ化させてからデータベースに組み込む
●Middlewareを利用してMongooseの振る舞い方をカスタマイズできる
Mongoose公式ドキュメント
「Middleware > Save/Validate」の項目
・validateする前、または後にイベントを設定できる。
・saveする前、または後にイベントを設定できる。
→save()する前に、データベースに保存したい値をハッシュ化させることができる。
●例)
データベースに格納する前にpasswordをハッシュ化
const mongoose = require('mongoose')
const bcrypt = require('bcryptjs')
const userSchema = new mongoose.Schema({
name: {
type: String, //データ型の設定
required: true,
trim: true
},
password:{
type: String,
required: true,
}
})
//middlewareを記述。saveする前にプレーンテキストをハッシュする
userSchema.pre('save', async function(next){ //アローファンクションは使わない。このbindingは大事な役割を果たすものだから
const user = this
console.log('Middleware is working')//ミドルウェアが動いているか確認するためのテストコード
if(user.isModified('password')){ //ハッシュ化されていないパスワードがある時
user.password = await bcrypt.hash(user.password, 8)
}//ここで値がハッシュされる
next()
})