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
【参考記事】