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