bcyptとは
パスワードを暗号化してセキュリティを向上させるためのGemです。
bcyptのインストール
Ruby on RailsのGemfile
の中にコメント付きで既に記述されていので
そのコメントアウトを外してbundle install
することでインストールすることができます。
% bundle install
bycypt
bycyptでは主に2つのメソッドを使うことができるようになります。
- has_secure_passwordメソッド
- authenticateメソッド
####・has_secure_password
モデル内に1行書くことにより、passwordとpassword_confirmationという属性を使うことができます。
maigationファイルにカラムを追加する場合はpassword,password_confirmationではなく
class AddDetailsToTitles < ActiveRecord::Migration
def change
add_column :users, :password_digest, :string
end
end
とする必要があるので注意です。
passwordを格納するデータベースのテーブルにはpassword_digestというカラムを作成しておくと、
passwordとpassword_confirmationで入力したパスワードが一致していれば
password_digestカラムに暗号化してパスワードを格納することができるようになります。
viewファイルにpassword
とpassword_confirmation
をフォームで送るだけでbcyptが暗号化してくれます。
<%= form_with model: @user do |f| %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %>
<% end %>
####・authenticateメソッド
authenticateメソッドはパスワードを認証するためのメソッドで正しいパスワードを入力するとtrue
を返し、間違ったパスワードを入力するとfalse
を返します。
パスワードのバリデーションは標準で装備されています。
##アプリを作って試してみる
% rails new password_app
% cd password_app
% rails db:create
# gem 'bcrypt', '~> 3.1.7'
を外して
% bundle install
Userモデルを作成してpassword_digestカラムを作成します。
% rails g model user password_digest:string
作成できたら
% rails db:migrate
userモデルにhas_secure_passwordを書きます。
class User < ApplicationRecord
has_secure_password
end
rails consoleで動作確認します。
$ rails c
間違ったパスワードを入れるとfalse
が返ってきて
正しいパスワードを入れると情報が返ってきています。
irb(main):001:0> u = User.new
(1.3ms) SELECT sqlite_version(*)
=> #<User id: nil, password_digest: nil, created_at: nil, updated_at: nil>
irb(main):002:0> u.password = "1234"
=> "1234"
irb(main):003:0> u.save
(0.2ms) begin transaction
User Create (3.6ms) INSERT INTO "users" ("password_digest", "created_at", "updated_at") VALUES (?, ?, ?) [["password_digest", "$2a$12$PaXO7LLKIqWGIXFhpkZcgOPSv2H.Mrmol6XwvI0aYMxrYdCFlmQCS"], ["created_at", "2021-05-06 13:04:13.549990"], ["updated_at", "2021-05-06 13:04:13.549990"]]
(1.6ms) commit transaction
=> true
irb(main):004:0> u.authenticate("3333")
=> false
irb(main):005:0> u.authenticate("1234")
=> #<User id: 4, password_digest: [FILTERED], created_at: "2021-05-06 13:04:13", updated_at: "2021-05-06 13:04:13">
以上です。
参考サイト
Qiita Railsにおけるパスワードの扱い方(BCrypt)
FREE SWORDER Railsアプリのパスワードを暗号化する方法〜bcryptの使い方〜
Rails Tutorial