1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

railsのキホンvol.11(パスワードの安全性、bcrypt)

Posted at

##パスワードの安全性を高める

データベースにパスワードをそのまま保存すると万が一の場合があるので、パスワードを暗号化する必要がある。
###gem(ジェム)
gemとはrubyやrailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの。
その中でも今回は、bcryptという「暗号化するためのgem」を使う。

###Gemfile
railsにはインストールしたいgemを記述するGemfileがある。

gem 'bcrypt'

という風にGemfileに記述し、コンソールで以下のコマンドを打つ。

$ bundle install

bcryptをインストールすると、has_secure_passwoerdというメソッドが使えるようになるので、パスワードを扱うモデルにこのメソッドを記述することで自動的にパスワードを暗号化するようになる。

models/user.rb
class User < ApplicationRecord
  has_secure_password
  ...
end

###password_digestカラム
has_secure_passwordメソッドは暗号化したパスワードをpassword_digestカラムに保存する。
現在はパスワードをpasswordカラムに保存しているので、passwordカラムpassword_digestに変更する必要がある。
マイグレーションファイルを作成。

$ rails g migration change_users_columns

マイグレーションファイルを編集。

change_users_columns.rb
class ChangeUsersColumns < ActiveRecord::Migration[5.0]
  def change
    add_column :users,:password_digest,:string
    remove_column :users,:password,:string
  end
end

データベース更新。

$ rails db:migrate

password_digestカラムに暗号化されたパスワードを保存するためには、今まで通りpasswordに値を代入する。
こうすることで、has_secure_passwordによってpasswordに代入された値が暗号化され、password_digestカラムに保存される。
このため、既にあるpasswordに関するコードを変更する必要はなし。

###暗号化されたパスワードを用いたログイン

まず、フォームに入力されたメールアドレスに一致するユーザーを取得する。
その次にフォームに入力されたパスワードと取得したユーザーのパスワードが一致するか判定する。

といった流れになる。

users_controller.rb
def ligin
  #フォームに入力されたメールアドレスに一致するユーザーを取得
  @user = User.find_by(:email params[:email])
  #フォームに入力されたパスワードと取得したユーザーのパスワードが一致するか判定
  if @user && @user.authenticate(params[:password])
  ..
  end
end

###authenticateメソッド
has_secure_passwordメソッドを有効にすると、authenticateメソッドが使用可能になる。
authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定する。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?