Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

個人的にアプリ作成時にテーブル設計で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>
kents1002
未経験からエンジニア就職を目指し、2019年11月からRuby on Railsメインに学習を続けています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away