bcryptアルゴリズム
code:md
- bcryptについて
- bcryptはパスワードを安全にハッシュ化するためのアルゴリズム
- 主にソルトとストレッチングの仕組みにより、セキュリティを高めている
- ソルトの自動生成
- bcryptはハッシュ化のたびに新しいソルトを自動生成
- 保存されるハッシュにはソルトが含まれる
- ストレッチング(コストファクター)
- コストファクターを調整することで計算量を増やせる
- コストファクターが高いとハッシュ化に時間がかかり、攻撃者にとって総当たり攻撃が困難になる
- ハッシュの出力形式例
- $2b$12$ABCDEFGHIJKL...MNoPQRS...TUVWX...Yz0a
- $2b$:bcryptのバージョン
- 12:コストファクター
- ABCDEFGHIJKL...:ソルトとハッシュが含まれた部分
- bcryptとレインボーテーブル攻撃
- レインボーテーブル攻撃とは
- 事前に生成した膨大なハッシュの一覧からハッシュ値に対応するパスワードを見つける攻撃方法
- 同じパスワードから常に同じハッシュが生成される通常のハッシュ関数(例:MD5、SHA-1など)では、この攻撃に弱い
- bcryptがレインボーテーブル攻撃に強い理由
- **ソルトの追加**:bcryptは毎回異なるソルトを使うため、同じパスワードでも異なるハッシュ値が生成される
- レインボーテーブルでの事前計算が無意味になる
- **コストファクターの調整**:コストファクターにより、ハッシュ計算が重くなるため、総当たり攻撃が困難になる
- ハッシュ文字列が漏洩した場合の安全性
- ソルトが含まれているため、各パスワードで異なるハッシュが生成される
- 事前計算済みのレインボーテーブルでは攻撃が難しい
- 各パスワードの調査にはコストファクター分の計算が必要となるため、攻撃者にとって時間がかかる
- bcryptの実装例(Ruby)
`ruby
require 'bcrypt'
# 新規登録時のハッシュ化
password = "password123"
hashed_password = BCrypt::Password.create(password)
# 保存されたハッシュ値の表示(ソルト含む)
# ログイン時のパスワード検証
input_password = "password123"
if BCrypt::Password.new(hashed_password) == input_password
puts "パスワードが一致しました!"
else
puts "パスワードが異なります。"
end
`
- bcryptのまとめ
- bcryptはレインボーテーブル攻撃や総当たり攻撃に強い耐性を持つ
- ソルトとコストファクターにより安全性が向上している
- ただし、二要素認証の導入やパスワードポリシーの強化など、総合的なセキュリティ対策が重要