search
LoginSignup
1

More than 1 year has passed since last update.

posted at

【Rails】has_secure_passwordでパスワードのセキュリティを強化

目的

パスワードのセキュリティを強化する。

手段

has_secure_passwordを使ってパスワードをハッシュ化する。

・ハッシュ化は、訳のわからない暗号みたいな文字列に変換すること。

・has_secure_passwordでハッシュ化されたパスワードは、同じ文字列で生成すれば常に同じ値になるので一致しているかどうかをチェックする際に使える。

・has_secure_passwordでハッシュ化したパスワードは、元のパスワードそのものに戻すことができないので、ハッシュ化されたパスワードを奪われたとしても何の問題もないのでパスワードのセキュリティが強固になる。

手順

1.Userモデル作成時のパスワード属性をpassword_digestとする。

 ➡︎has_secure_passwordを使う際の命名規則なので必須。

2.Gemfileにbcryptというgemを追加して、インストールする。

 ➡︎bcryptというgemをインストールすることで、has_secure_passwordを使えるようになりパスワードをハッシュ化できるようになる。
 ➡︎$ bundle installコマンドを忘れずに。

3.Userモデルにhas_secure_passwordを記述。

 ➡︎Userモデル内にhas_secure_passwordを記述したことにより、password属性とpassword_confirmation属性の2つの属性が追加される。データベースのカラムとは対応していない属性。

 ➡︎どういうことかというと、この2つはユーザーに入力を求めるためだけの属性で、この2つの属性をユーザーに入力させることで、Railsはこの2つの一致をチェックした後、一致していたらそのパスワードをハッシュ化してデータベースのpassword_digest属性に格納されるようになっている。

以上の記述を行うことで、ユーザーの新規登録時に入力したパスワードはハッシュ化されるようになる。

ターミナル
  $ rails g model user ... ... password_digest:string
db/migrate/[timestamps]_create_users.rb
  class CreateUsers < ActiveRecord::Migration[5.2]
    def change
      create_table :users do |t|
        .
        .
        .
        t.string :password_digest
        .
        .
        .
      end
    end
  end
ターミナル 
  $ rails db:migrate
Gemfile
  gem 'bcrypt', '~> 3.1.7'
ターミナル
  $ bundle install
app/models/user.rb
  class User < ApplicationRecord
    has_secure_password
    .
    .
    .
  end



試しにコンソールで確認してみる。

  $ rails c --sandbox
    > user = User.new(..., password: '123456', password_confirmation: '123456')
    > user.save
    => true
 
    >user.password_digest
    => 'fflafbnalwefhhhawkleufhb'

ユーザーにpasswordとpassword_confirmationに任意の値を入力させれば、2つの属性が一致しているかどうかを検証した後に、ちゃんとハッシュ化されたパスワードがpassword_digest属性に保存されている事がわかる

参考

 現場で使える Ruby on Rails 5速習実践ガイド

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
What you can do with signing up
1