【暗号】bcryptの原理:2025.9.9

未分類

🔐 bcryptってなに?

みなさん、パスワードをどうやって守っているか気になったことはありませんか?
その答えの一つが bcrypt です。

bcryptは「パスワードをそのまま保存せず、安全にハッシュ化する仕組み」です。
ここで言うハッシュとは、どんな長さの文字列でも「固定の桁数」に変換する関数のこと。例えば、文字列の文字コード番号を全部足して、ある桁数で割った余りを結果とする——これだけでも“簡易ハッシュ”になります。もちろん実際のbcryptははるかに複雑で安全です。


🧩 bcryptの特徴

  1. ソルト付きハッシュ
    同じパスワードでも毎回違う結果になるように「ソルト」と呼ばれるランダム情報を加えます。bcryptでは、このソルトと「ハッシュを何回繰り返すか」という回数をセットにして、結果の頭に組み込んで保存するので、検証時にも同じ条件で計算できます。
  2. 計算コストを調整できる
    bcryptは「ストレッチング」と呼ばれる仕組みを使い、意図的に計算を重くします。これにより、総当たり攻撃(ブルートフォース)が現実的に困難になります。
  3. 古さを感じさせない設計
    1999年に登場しましたが、現在でも十分に強固。セキュリティ界隈では長年使われる定番ライブラリです。

🛠️ 実際にどう使うの?

Pythonならこんな感じ👇

import bcrypt

password = b"my_secret_password"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())  # ソルトと回数が内部に組み込まれる

print("保存するハッシュ:", hashed)

# ログイン時の確認
if bcrypt.checkpw(password, hashed):
    print("認証OK!")
else:
    print("認証失敗")

✨ まとめ

  • ハッシュは「任意の入力を固定長に変換する関数」
  • bcryptはソルトと回数を組み込み、安全にパスワードを守る
  • 計算コストを調整し、未来のコンピュータにも対抗できる

つまり、「パスワードをそのまま保存しちゃダメ!bcryptを使おう」 というのが大事なメッセージです。


📎 付録:ハッシュの超シンプルな作り方(例)

ここでは本物のbcryptではなく、イメージをつかむためのおもちゃ版を紹介します。

ステップ1:文字を数字にする

パスワード「PassWordX」のアルファベットを数字に変換します。
例:A=1, B=2, …, Z=26 で考えます。

  • P=16, a=1, s=19, s=19, W=23, o=15, r=18, d=4, X=24

合計すると → 16+1+19+19+23+15+18+4+24 = 139

ステップ2:固定の桁数に収める

3桁にしたいので「1000で割ったあまり」を使います。
139 ÷ 1000 の余りは 139。これがハッシュ値です。

ステップ3:ソルトを追加する

ここでランダムな数字(例:527)を「ソルト」として使います。
「ハッシュ計算をソルト回数だけ繰り返す」と考えて、139を3回ぐるぐる計算してもいいし、単純にソルトを頭につけて保存してもOK。

結果として保存されるのは:
527-139

イメージまとめ

  • パスワード → 数字に変換
  • 余りをとって桁数を固定
  • ソルトをくっつけて保存

これが「ハッシュとソルト」の超シンプルなイメージです。実際のbcryptはもっと複雑で安全ですが、仕組みのイメージは同じです

コメント

タイトルとURLをコピーしました