メインコンテンツへスキップ

ハッシュとは

この記事は約 2 分で読めます

ハッシュ (Hash) とは、任意の長さのデータを固定長の値に変換する一方向関数です。パスワードの保存において重要な役割を果たし、元のパスワードを復元できない形で安全に保管するために使用されます。同じ入力からは常に同じハッシュ値が生成されますが、ハッシュ値から元のデータを逆算することは計算上困難です。

ハッシュと暗号化の違い

ハッシュと暗号化は混同されやすい概念ですが、決定的な違いがあります。暗号化は正しい鍵を使えば元のデータに復号できる双方向の変換です。一方、ハッシュは元のデータに戻せない一方向の変換であり、復号という概念が存在しません。パスワードの保存にはハッシュが適しています。サービス側がパスワードの平文を保持する必要がなく、データベースが漏洩しても元のパスワードが直接露出しないためです。逆に、通信中のデータ保護には暗号化が適しています。受信者がデータを読めなければ意味がないからです。

パスワード保存での活用

安全なシステムでは、パスワードを平文で保存せず、ハッシュ化した値を保存します。ログイン時には入力されたパスワードをハッシュ化し、保存されたハッシュ値と比較します。代表的なハッシュアルゴリズムには SHA-256 や bcrypt 、 Argon2 があります。 SHA-256 は高速ですがパスワード用途には速すぎるため、意図的に計算コストを高くした bcrypt や Argon2 が推奨されます。 2025 年時点では OWASP が Argon2id を最も推奨するパスワードハッシュアルゴリズムとして位置づけています。計算コストが高いほど、ブルートフォース攻撃に対する耐性が向上します。

古いハッシュからの移行が一括でできない理由

パスワード保存に古いアルゴリズムを使っているシステムを新しい方式へ移行する場面では、ハッシュの一方向性そのものが制約になります。保存されているのはハッシュ値だけで元のパスワードには戻せないため、データベース上の値を一括で新しいアルゴリズムのハッシュへ変換することはできません。サービス側が平文のパスワードに触れられるのは、利用者がログインしてパスワードを入力した瞬間だけです。そのため実務での移行は、ログイン時に従来方式で検証が通った平文をその場で新しいアルゴリズムでハッシュ化し直し、保存値を置き換えていく段階的な進め方になります。ログインしない利用者の分は古いハッシュのまま残るので、移行期間中は新旧どちらの形式かを判別して検証できる仕組みが必要です。パスワードを平文で持たないという設計の利点が、移行のときには手間として跳ね返ってくる好例です。

ハッシュ処理フロー

パスワード入力
ソルト付加
ハッシュ関数で変換
固定長ハッシュ値
DB に保存

実務での落とし穴と対策

単純なハッシュ化だけではレインボーテーブル攻撃に脆弱です。この対策としてソルト (ランダムデータ) を付加してからハッシュ化する手法が標準的です。実務でよくある誤りは、 MD5 や SHA-1 など古いアルゴリズムをパスワードのハッシュ化に使用することです。これらは高速すぎるため、 GPU を使った攻撃で短時間に大量のハッシュを計算されてしまいます。長くランダムなパスワードは、ハッシュ化された状態でもブルートフォース攻撃に対して高い耐性を持ちます。

関連用語

この記事は役に立ちましたか?