0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsセキュアパスワードの実装について

Posted at

セキュアパスワードとは

セキュアパスワードという手法を使う際には、 ユーザーにパスワードとパスワードの確認の入力をさせ、 そのまま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
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?