概要
個人的にアプリ作成時にテーブル設計でpassword_digest
をカラムとして、セキュアパスワードを利用する前提でテーブル作成していましたが、改めてセキュアパスワードについて理解しておくためまとめていきます。
セキュアパスワードとは
パスワードの値をDB上にそのまま保存することはセキュリティ上問題があります。
そのためセキュアパスワードというパスワードとパスワード確認をユーザーに入力させて、
その2つの値をハッシュ化したものをデータベースに保存するという方法で脆弱性を回避します。
このハッシュ化というのは{key => value}のハッシュではなくて、ハッシュ関数というものを利用して入力されたパスワードを異なる値に変更する処理のことを指します。
パスワードをランダムな文字列に変換して、DBに保存するということ。
セキュアパスワードの実装方法
has_secure_passwordメソッドをモデルに記述
has_secure_password
メソッドを利用して、password_digest
カラムにハッシュ化した値を保存するという方法を行います。
ユーザーモデルにhas_secure_password
を記述します。
ついでに一般的なパスワードのバリデーションも追記しておきましょう。
class User < ApplicationRecord
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
end
この記述によって、Userモデルはpassword
とpassword_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>