Railsでセキュアなパスワードの実装

Railsでセキュアなパスワードの実装

みなさんこんにちは、新人の意識高丸です。
昨日もrails初心者勉強会、gaienrb #13に参加してきました。
今回もチュートリアルをすすめていきました。

ユーザ認証の機能実装でユーザ情報を保存するためのテーブルや、そのテーブルに対応したモデルを作りました。

ユーザ情報の保存というと、パスワードの扱いをどうするかを決めなければならないと思います。パスワードをデータベースに平文で保存すると危険なので、パスワードをSha1で暗号化してからsaltというランダムな文字列をつける方法がRailsの代表的な本などでも紹介されていました。
saltをつけるのは、辞書攻撃に対応するためだと思います。
この実装では、パスワード保存時にsaltをつけて暗号化して保存し、パスワード検証の時に入力された平文パスワードにsaltを付けて暗号化し、保存されている暗号化済パスワードと比較するという単純なものです。

railsでは3.1からhas_secure_passwordという機能が使えるようになっており、このようなセキュアなパスワードを簡単に実装できるようになっています。

実装は、モデルに「password_digest」という文字列カラムを追加し、モデルに「has_secure_password」と1行追加するだけで対応できるようです。

…password_digestカラム追加のマイグレーション(例)
class AddPasswordDigestToUsers < ActiveRecord::Migration
def change
add_column :users, :password_digest, :string
end
end

…モデルにhas_secure_passwordを設定する
class User < ActiveRecord::Base
.
.
.
has_secure_password
end

認証する際には、emailなどから対象オブジェクトを取得した後、パスワードを引数にauthenticateメソッドを実行します。

…認証のコード(例)
user = User.find_by(email: email)
current_user = user.authenticate(password)

認証が成功するとユーザオブジェクトが返却され、失敗するとfalseが返却されます。

railsにはこのようにたくさんの省力化の仕組みが沢山あると思うので、調べずにうっかり作らないようにしなければいけないと思いました。

TAG

  • このエントリーをはてなブックマークに追加
意識 高丸
エンジニア 意識 高丸 takamaru

Rubyについて日々勉強している新人エンジニアです。初心者向けRuby勉強会のレポートなどを投稿していきます。