LoginSignup
4
2

More than 3 years have passed since last update.

【Rails】セキュアパスワード(has_secure_passwordメソッド)について

Posted at

概要

個人的にアプリ作成時にテーブル設計でpassword_digestをカラムとして、セキュアパスワードを利用する前提でテーブル作成していましたが、改めてセキュアパスワードについて理解しておくためまとめていきます。

セキュアパスワードとは

パスワードの値をDB上にそのまま保存することはセキュリティ上問題があります。
そのためセキュアパスワードというパスワードとパスワード確認をユーザーに入力させて、
その2つの値をハッシュ化したものをデータベースに保存するという方法
で脆弱性を回避します。

このハッシュ化というのは{key => value}のハッシュではなくて、ハッシュ関数というものを利用して入力されたパスワードを異なる値に変更する処理のことを指します。
パスワードをランダムな文字列に変換して、DBに保存するということ。

セキュアパスワードの実装方法

has_secure_passwordメソッドをモデルに記述

has_secure_passwordメソッドを利用して、password_digestカラムにハッシュ化した値を保存するという方法を行います。

ユーザーモデルにhas_secure_passwordを記述します。
ついでに一般的なパスワードのバリデーションも追記しておきましょう。

models/user.rb
class User < ApplicationRecord
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }
end

この記述によって、Userモデルはpasswordpassword_confirmationの2つの属性が使えるようになります。
さらに、ハッシュ化したパスワードをDB内のpassword_digestに保存するようになります。

bcryptをinstall

次にgem'bcrypt'(ビークリプト)をインストールします。
has_secure_passwordメソッドを使用するためにbcryptが必要になります。
bcryptによってパスワードをハッシュ化するための関数が提供されます。

gem 'bcrypt', '3.1.13'

Gemfileに追記して、

$ bundle install

確認

セキュアパスワードの設定をしてから、登録したユーザーのpasswordは以下のようにハッシュ化されてpassword_digestに保存されるようになります。

irb(main):001:0> User.last
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<User id: 18, name: "testttt", email: "testtt@a.com", 
password_digest: "$2a$10$C/nH7reWZY/8QwbN8YFcaOjQSPtqW3aEDGrNuG.8ePP...", 
created_at: "2020-01-20 15:05:43", updated_at: "2020-01-20 15:05:43", 
password: nil, password_confirmation: nil, admin: false>
4
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
4
2