LoginSignup
0
2

More than 3 years have passed since last update.

安全性の高いパスワードの扱い(Ruby on Rails)

Last updated at Posted at 2020-07-25

プログラミングの勉強日記

2020年7月25日 Progate Lv.223
Ruby on RailsⅩⅠ

概要

 今まで作成したアプリはパスワードが普通の文字列として保存されている。これだと、PCの覗き見やハッキングされデータが盗まれた場合にそのパスワードを使って簡単に他人のアカウントに不正ログインできる。

 →安全性の高いパスワードは万が一覗き見やデータが盗まれてもパスワードの内容がわからない状態である。パスワードを複雑な文字列(暗号化された特殊な文字列)にすることで安全性を高められる。

Gemfileの編集

 Railsでパスワードを暗号化するときはgem(読み方:「ジェム」)というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回はbcryptという暗号化するためのgemを使う。
 Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。gem 'gemの名前'と記述する。rails newコマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
 gem 'gemの名前', 'gemのバージョン' とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。

Gemfile
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'

bcryptのインストール
gem 'bcrypt'
ターミナル
$ bundle install

暗号化する

  1. bcryptをインストールするとhas_secure_passwordというメソッドが使えるようになる。パスワードを扱うUserモデルにhas_secure_passwordを追加する。これでユーザを保存するときに自動的にパスワードを暗号化する。
user.rb
class User < ApplicationRecord
  has_secure_password
end

 has_secure_passwordはpasswordが存在するか自動的にチェックする。

  1. passwor_digestカラムを追加する。has_secure_passwordメソッドは暗号化したパスワードをpasswor_digestカラムに保存する。rails generate migrationコマンドでマイグレーションファイルを作成し、passwor_digestカラムが追加されるように編集する。次にpasswordカラムが削除されるように編集する。カラムの削除はremove_columnを使う。1つのマイグレーションファイルで複数のカラムを変更できる。
ターミナル
$ rails generate migration change_users_columns
 マイグレーションファイル変更後
$ rails db:migrate
2020~_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
  1. password_digestカラムに暗号化されたパスワードを保持するためには今まで通りpasswordに値を代入する。これで、has_secure_passwordによってpasswordに代入された値が暗号化され、password_digestカラムに保存される。なので、すでにあるpasswordに関するコードは変更しなくていい。

暗号化されたパスワードでのログイン

 フォームに入力されたメールアドレスに一致するユーザを取得し、フォームに入力されたパスワードと取得したユーザのパスワードが一致するかを判定する。has_secure_passwordメソッドを有効にするとauthenticateメソッドを使えるようになる。authenticateは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定する。authenticateメソッドを使って、「送信されたメールアドレスと一致するユーザ」のpassword_digestと送信されたパスワードが一致するかどうかでログイン処理をする。

0725.png

users_controller.rb
def login
  @user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])

0
2
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
0
2