Bcrypt를 사용하지 않고 암호화하려면

9547 단어 RubyRails

개시하다


만약 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
그리고 뷰를 적당히 쓰면 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의 값을 어떻게 해야 할지 생각하고 있다. 어쨌든 '시크릿키' 다.
users_helper.달성
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
이렇게 등록된 비밀번호가 암호화되었다.
로그인 기능 사용
아무튼 세션스.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
이런 느낌이에요.
이렇게 하면 로그인할 수 있다. 로그인한 비밀번호의 값은 se64GVO 8lvmmU처럼 암호화되었다.
그리고 salt 부분, 이번에는 시크릿키로 어떻게 할까요?

추기


트랙/credentialsyml.enc에 저장하려고 했지만 잘 안 돼서 곤란했지만 WSL을 쓰면 된다는 조언을 받았습니다..
WSL을 사용하여 설정할 수 있습니다.(환경 변수 PATH에 이상한 일이 생겨서 막히기 쉬워요...)
그래서 창에 설치된 ubuntu에
EDITOR="vi" rails credentials:edit
거기까지 걸어가다
salt:
  salt_key: secretkey
이렇게 설정했어요.
이것 괜찮아요?키 사용법
Rails.application.credentials.salt[:salt_key]

이런 느낌은 불러도 돼.
이 users 사용하기helper.달성
users_helper.rb
module UsersHelper

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

end
이렇게 써서 쓰셔도 돼요.
알려주셔서 감사합니다.

겸사겸사 말씀드리겠습니다.


Bcrypt를 사용하면 gem install bcrypt
models/user.달성
user.rb
class User < ApplicationRecord
    has_secure_password
end
마무리 멘트가 굉장히 쉬워요.confirmation

좋은 웹페이지 즐겨찾기