LoginSignup
0
0

More than 5 years have passed since last update.

Bcryptを使わないでパスワード暗号化したい

Last updated at Posted at 2018-12-08

初めに

Railsでbcryptを使えばパスワードの暗号化やユーザー登録時のpassword_confirmationを簡単に実装できる。

けど暗号化とかかっこいいので自分でもやってみたいということでbcryptを使わないでパスワードの暗号化をしたい。

とりあえず

rails new secure
rails g model user name:string mail:string password:string
rails g controller users index show edit new

して準備完了

普通に登録しログインできるようにする

users_controller.rb

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find params[:id]
  end

  def new
    @user = User.new
  end

  def create
    @user = User.create(user_params)
    if @user.save
      redirect_to users_path 
    else 
      render :new 
    end 
  end 

  def edit
    @user = User.find params[:id]
  end

  def update
    if User.update(user_params)
      redirect_to users_path
    else 
      render :edit
    end 
  end 

  private

  def user_params
    params.require(:user).permit(:name,:mail,:password)
  end 

end

あとはviewを適当に書けばOK

とりあえずcryptをつかってみる

crypt

irb(main):001:0> str = "hello world"
=> "hello world"
irb(main):002:0> p str.crypt("asdf")
"asodDSQaBIZi."
=> "asodDSQaBIZi."

といった感じでstr.crypt(salt)という構文で暗号化ができる。

このsaltの値をどうしようかと思うのですがとりあえず"secretkey"ってことにしときます。

users_helper.rbに

users_helper.rb
module UsersHelper

    def secure_pass(password)
        secure_password = password.crypt("secretkey")
        return secure_password
    end

end

こう書いて

users_controller.rbのcreateを

users_controller.rb
  def create
    password = user_params[:password]
    @user = User.create(user_params.merge(password: secure_pass(password)))
    if @user.save
      redirect_to users_path 
    else 
      render :new 
    end 
  end

みたいにすれば登録されるパスワードは暗号化されてる:sunny:

次にログイン機能で

とりあえずsessions_controllerを作って

sessions_controller.rb
class SessionsController < ApplicationController
  include UsersHelper

  def new
  end

  def create 
    user = User.find_by(mail: params[:mail])
    if user.password == secure_pass(params[:password])
      session[:user_id] = user.id 
      redirect_to users_path
    else 
      render :new
    end 
  end

end

こんな感じにした

これでログインできるし登録されるパスワードの値はse64GVO8lvmmUみたいな感じで暗号化されてます。

あとはsaltの部分、今回はsecretkeyとしているところをどうしたらいいか

追記

secretkeyをconfig/credentials.yml.encに保存しようとしたがうまくいかなくて困ってましたがWSLを使えばできるとアドバイスをもらいまして...

WSLを使って設定できるようになりました。(環境変数PATHが変なことなってて結構つまづいた…)

ということでwindowsにインストールしたubuntu上で

EDITOR="vi" rails credentials:edit

を行ってそこに

salt:
  salt_key: secretkey

みたいな感じで設定した

このsalt_keyの使い方は

Rails.application.credentials.salt[:salt_key]

みたいな感じで呼び出すことができます。

これを使ってusers_helper.rbに

users_helper.rb
module UsersHelper

    def secure_pass(password)
        secure_password = password.crypt(Rails.application.credentials.salt[:salt_key])
        return secure_password
    end

end

こんな感じで書いて使うことができます:sunny:

教えてくださった方ありがとうございました。

ちなみに

Bcryptを使うとgem install bcryptして
models/user.rbに

user.rb
class User < ApplicationRecord
    has_secure_password
end

とかけばおわりとすごく簡単だしpassword_confirmationも実装してくれる

0
0
2

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