Railsアプリでパスワードを暗号化したい!

Railsアプリを作ったらやりたいのが

ユーザーパスワードの暗号化

です。

 

暗号化されていないと、データベースの中身をすればパスワードを閲覧できちゃいますから。

アプリ運営者がパスワードを確認できちゃうなんてセキュリティ的にいかんですよね。

万が一、データベース情報が漏れてしまったら、それこそアウト。個人情報流出事件として報道されかねません。

そこでパスワードを暗号化するために導入したいのが、

bcrypt

というgemです。

 

 

パスワードを暗号化できるgem「bcrypt」の使い方

次の5ステップを踏んでみてください。

 

gemを追加

パスワードの暗号化に使うgemを追加。

今回はbcryptを導入するので、Gemfileの末尾に

gem 'bcrypt'

を追記して上書き保存。

その後、コマンドラインにて

$ bundle install

を発動します。

これでRailsアプリにbcryptをインストールできましたね。

 

has_secure_password

次は

has_secure_password

という1行をユーザーのモデルファイル(user.rb)に追記。

これでパスワードを暗号化できるようになりました。最終的にuser.rbは次のようになります。

class User < ApplicationRecord
has_secure_password
	
end

has_secure_passwordをモデルファイルに記載すると、Userモデルに、

  • password
  • password_confirmation

という属性が追加され、authenticateメソッドが使えるようになります。

パスワードのバリデーションは標準装備されています。

パスワードのバリデーションを設定した方は削除しましょう。

>>さもなくばアプリに不具合が出ちゃいます

 

password_digestカラムを追加

暗号化されたパスワードはpasswordカラムではなく、

password_digest

というカラムに保存されます。

ユーザーテーブルにpassword_digestがない方はカラムを追加しましょう。

Railsのデータベースにカラムを追加するときは、

$ rails g migration 任意のファイル名

で追加できましたよね。

今回は

$ rails g migration password_digest

とします。

 

コマンド発動後、予定通りマイグレーションファイルができたら、

$ rails db:migrate

を発動してデータベースに反映。

すでにpasswordカラムが存在している場合は削除しておきましょう。

カラムの削除はremove_columnメソッドでしたね。

詳しくはRailsのカラム追加・削除方法を読んでみてください。

 

authenticateメソッドを追加

最後にauthenticateメソッド追加です。

@user.authenticate(引数)

とすることで、暗号化されたパスワードと一致するユーザーオブジェクトを取得できます。

 

よって、users_controller.rbのloginアクションで、

@user.authenticate(params[:password])

とし、これをif文の条件に設定するのです。

最終的にusers_controller.rbのloginアクションは次になりますね。

def login
  @user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])
    session[:user_id] = @user.id
  
else
  @error_message = "間違ってますよ"
  @email = params[:email]
  @password = params[:password]
  render("users/login_form")
end

end

これでセンシティブなパスワード情報を暗号化して扱えるようになりました。

ご検討をお祈りします。

 

それでは!

Lin

 

【参考記事】