セキュアパスワードとは
セキュアパスワードという手法を使う際には、 ユーザーにパスワードとパスワードの確認の入力をさせ、 そのままDB上に保存するのではなくハッシュ化したものを DBに保存する方法のことを指します。セキュアパスワード使用されるハッシュ化の処理は、
入力されたデータをハッシュ関数を使用して
元のデータに戻すことのできない(不可逆)形にする処理を行なっています。
ユーザー認証は、「パスワードの送信」→「ハッシュ化」→「DB内のハッシュ化された値との比較」といったような手順で進んで行きます。
比較した結果が一致すれば、送信したパスワード(入力したパスワード)は正しいということになり、ユーザー認証されることになります。
仮にDBの内容が盗まれたり、覗き見られるようなことがあってもパスワードの安全性が保たれ、
生のパスワードをデータベースに保存することなく認証することができます。
セキュアパスワードの実装方法
モデルファイルにhas_secure_passwordメソッドを追加
modelにhas_secure_passwordを追加します。models/user.rb
class User < ApplicationRecord
has_secure_password
end
モデルにhas_secure_passwordを追加することで、下記のような機能が使えるようになります。
- ハッシュ化したパスワードを、データベース内の「password_digest」という属性に保存することができるようになる
- 2つのペアの仮想的な属性「password」、「password_confirmation」が使用できるようになり、存在性と値が一致するかどうかのバリデーションも追加される *(モデルのオブジェクトからは存在しているように見えるが、データベースには対応するカラムが存在しない、という意味です。)
- authenticateメソッドが使えるようになる
has_secure_password機能は記述するだけで使用可能になりますが、
モデル内に「password_digest」という属性が存在している必要があります。
password_digestをテーブルに追加
コンソールから、属性名と型の情報を入力していきます。$ rails generate migration add_password_digest_to_users password_digest:string
[timestamp]_add_password_digest_to_users.rb
class AddPasswordDigestToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :password_digest, :string
end
end
エラー等がなければ、マイグレーションを実行します。
$ rails db:migrate
bcryptをinstall
has_secure_passwordを使ってパスワードをハッシュ化するためには、最先端のハッシュ関数であるbcryptが必要になりますbcryptを使うためにGemfileに追加します。
Gemfile
gem 'bcrypt', '3.1.13'
bundle install