Tomoya's Blog

bcryptについて

May 4, 2020 • ☕️ 1 min read

bcryptによるパスワードの暗号化について調べたのでメモ。

ユーザーが入力したパスワードをそのままデータベースに保存するのは危険すぎる。Railsのgemであるbcryptを使用する場合、ハッシュ関数というものを使ってランダムな文字列で暗号化する。

ハッシュ関数とは

入力値の長さに関係なく、あらかじめ決められた固定長の出力データを得る関数。

このハッシュ関数を使って暗号化された文字列は、

  • 一度暗号化されたら、元に戻すことは不可能
  • 暗号化される前の値をハッシュ関数に通すと、同じ暗号化された値(ハッシュ値)が返ってくる
  • その返ってくる値が同じかどうかで照合が可能

他にもセキュリティ面をより強化するために、ソルトストレッチングという手法も組み込まれているが、一番下の記事で詳しく説明されているので割愛。

実際にRailsで使うのは、非常に簡単。 ログイン機能の実装において有名なdeviseではデフォルトで備わっている。

使い方

  1. Railsをdevise無しで開発している場合は、Gemfileに以下を記載してbundle install
gem 'bcrypt'
bundle install
  1. パスワードの暗号化を見てみたいので、Userモデルを作成。 のちに使用するメソッドの関係で、パスワードを保存するカラムはpassword_digestと命名する必要があるので注意。
rails g model User name:string email:string password_digest:string
  1. モデルを作成し終わったら、マイグレーションファイルを反映させる。
rails db:migrate
  1. user.rbにhas_secure_passwordを記述。bcryptをbundle installすると使用可能になるメソッドで、password_digestカラムに暗号化したパスワードを保存してくれる。
class User < ApplicationRecord
  has_secure_password
end

これで、Userが保存された時に、passwordというカラムに入った文字列はハッシュ関数で暗号化され、ユーザーが入力した値ではなくハッシュ値のみが保存されるようになる。

ログインやパスワードの更新時には、ユーザーが過去に入力した正確な文字列を送信すれば、返ってくるハッシュ値が同じなので照合が成功して「パスワードは正しい」となり、正常に処理が行われる。

参考にした記事はこちら

Tomoya


Relative Posts:

bcrypt(Rails)

May 4, 2020

My goals for next one year

May 3, 2020

Tomoya Sonokui

To output what I learn from things, and brush up both English & Japanese writing skills. 日々感じたことや学んだことを日本語と英語でアウトプットするための技術系ブログ

RotateLinkImg-iconRotateLinkImg-iconRotateLinkImg-icon