メインコンテンツへスキップ
セキュリティ

ハッシュ関数の基礎知識|MD5とSHA-256の違い

読了時間: 約8分

ハッシュ関数とは

ハッシュ関数の定義

ハッシュ関数(Hash Function)とは、任意の長さのデータを固定長の文字列(ハッシュ値)に変換する一方向性の関数です。「一方向性」とは、ハッシュ値から元のデータを逆算することが事実上不可能であることを意味します。例えば、「Hello」という文字列をSHA-256でハッシュ化すると、常に「185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969」という64文字の文字列が生成されます。

ハッシュ関数の特徴

  • 決定性:同じ入力データからは常に同じハッシュ値が生成される
  • 高速性:ハッシュ値の計算が高速に行える
  • 一方向性:ハッシュ値から元のデータを逆算することが事実上不可能
  • 衝突耐性:異なるデータから同じハッシュ値が生成される確率が極めて低い
  • 雪崩効果:入力データが1ビット変わるだけで、ハッシュ値が大きく変化する
入力: Hello
SHA-256: 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
入力: hello(小文字に変更)
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

わずか1文字の違い(Helloとhello)でも、まったく異なるハッシュ値が生成されます。これが「雪崩効果」です。

暗号化との違い

項目ハッシュ関数暗号化
方向性一方向(元に戻せない)双方向(復号化で元に戻せる)
出力の長さ固定長(アルゴリズムによる)入力に応じて可変
主な用途データ検証、パスワード保存データの秘匿、通信の保護
代表例MD5、SHA-256、SHA-512AES、RSA、DES

当サイトの無料ハッシュ生成ツールを使えば、テキストを簡単にMD5、SHA-1、SHA-256、SHA-512でハッシュ化できます。ブラウザ上で完結するため、データが外部に送信される心配もありません。

主要なハッシュアルゴリズムの比較

⚠️MD5(Message Digest Algorithm 5)

ハッシュ長: 128ビット(32文字の16進数)
開発年: 1991年
セキュリティレベル: 非推奨(脆弱性あり)

MD5は1991年に開発された古いハッシュアルゴリズムで、かつては広く使用されていました。しかし、2004年に衝突攻撃(異なるデータから同じハッシュ値を生成する攻撃)に対する脆弱性が発見され、現在ではセキュリティ目的での使用は推奨されていません。ファイルの一意性チェックや非セキュリティ目的での識別子生成など、限定的な用途では今でも使用されています。

⚠️SHA-1(Secure Hash Algorithm 1)

ハッシュ長: 160ビット(40文字の16進数)
開発年: 1995年
セキュリティレベル: 非推奨(脆弱性あり)

SHA-1は1995年に米国国家安全保障局(NSA)によって開発されました。MD5よりも強力ですが、2017年にGoogleが実際の衝突攻撃に成功したことで、セキュリティ用途での使用は非推奨となりました。GitやSSL証明書など、一部のレガシーシステムではまだ使用されていますが、SHA-256以降への移行が推奨されています。

SHA-256(Secure Hash Algorithm 256)

ハッシュ長: 256ビット(64文字の16進数)
開発年: 2001年
セキュリティレベル: 推奨(現在最も広く使用)

SHA-256はSHA-2ファミリーの一つで、現在最も広く使用されているハッシュアルゴリズムです。ビットコインなどのブロックチェーン技術、SSL/TLS証明書、デジタル署名など、セキュリティが重要な用途で標準的に使用されています。現時点で実用的な衝突攻撃は発見されておらず、十分に安全とされています。

SHA-512(Secure Hash Algorithm 512)

ハッシュ長: 512ビット(128文字の16進数)
開発年: 2001年
セキュリティレベル: 推奨(SHA-256よりさらに強力)

SHA-512はSHA-2ファミリーの中で最も長いハッシュ値を生成するアルゴリズムです。SHA-256よりもさらに強力なセキュリティを提供しますが、処理速度は若干遅くなります。64ビットアーキテクチャのシステムでは、SHA-256よりも高速に動作する場合があります。非常に高いセキュリティが求められる用途に適しています。

アルゴリズムハッシュ長文字数セキュリティ推奨度
MD5128ビット32文字脆弱❌ 非推奨
SHA-1160ビット40文字脆弱❌ 非推奨
SHA-256256ビット64文字強固✅ 推奨
SHA-512512ビット128文字非常に強固✅ 推奨

活用シーン

ハッシュ関数は、セキュリティや データ整合性の確保において様々な場面で活用されています。代表的な5つの活用シーンを紹介します。

🔒パスワードハッシュ

Webサービスでは、ユーザーのパスワードを平文で保存せず、ハッシュ化して保存します。ログイン時には、入力されたパスワードをハッシュ化し、保存されているハッシュ値と比較します。これにより、データベースが漏洩してもパスワードが直接露出しません。ただし、SHA-256を直接使うのではなく、bcrypt、scrypt、Argon2などの専用アルゴリズム(ソルトとストレッチング機能を持つ)を使用することが推奨されます。

📄ファイル整合性チェック

ソフトウェアのダウンロード時に、ファイルが改ざんされていないかを確認するためにハッシュ値が使用されます。配布元が提供するハッシュ値と、ダウンロードしたファイルのハッシュ値を比較することで、ファイルの完全性を検証できます。例えば、LinuxディストリビューションのISOファイルには、SHA-256のチェックサムが提供されています。

✍️デジタル署名

デジタル署名では、まずドキュメントのハッシュ値を計算し、そのハッシュ値を秘密鍵で暗号化します。受信者は公開鍵で署名を復号化してハッシュ値を取り出し、ドキュメントのハッシュ値と比較することで、改ざんされていないことと送信者の正当性を確認できます。SSL/TLS証明書、電子契約、ソフトウェア署名などで広く使用されています。

⛓️ブロックチェーン

ビットコインをはじめとする暗号通貨では、SHA-256が中核技術として使用されています。各ブロックには前のブロックのハッシュ値が含まれており、ブロックチェーン全体の改ざんを事実上不可能にしています。マイニング(採掘)プロセスでも、特定の条件を満たすハッシュ値を見つけるための計算が行われます。

🎫セッショントークン生成

Webアプリケーションでは、ユーザーのセッションを識別するためのトークンを生成する際にハッシュ関数が使用されます。ランダムな値とタイムスタンプをハッシュ化することで、推測困難なセッションIDを生成できます。これにより、セッションハイジャック攻撃のリスクを低減できます。

実践で試す:ハッシュ生成ツールで、実際にテキストをハッシュ化して、これらの特性を確認してみましょう。

セキュリティ上の注意点

MD5とSHA-1は使用しない

MD5とSHA-1は衝突攻撃に対して脆弱であることが証明されています。攻撃者は、意図的に同じハッシュ値を持つ異なるファイルを作成できるため、セキュリティ目的での使用は危険です。パスワードハッシュ、デジタル署名、SSL証明書などでは、必ずSHA-256以上を使用してください。

レインボーテーブル攻撃

レインボーテーブルとは、一般的なパスワードとそのハッシュ値を事前に計算したデータベースです。攻撃者は、盗んだハッシュ値をレインボーテーブルで検索することで、元のパスワードを特定できます。この攻撃を防ぐには、パスワードをハッシュ化する前に「ソルト」(ランダムな文字列)を追加します。

悪い例(ソルトなし):
SHA-256("password123") = ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f
良い例(ソルトあり):
SHA-256("password123" + "x7k2p9") = 1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2v3w4x5y6z7a8b9c0d1e2f3

パスワード専用アルゴリズムを使用

パスワードの保存には、SHA-256を直接使用するのではなく、bcrypt、scrypt、Argon2などの専用アルゴリズムを使用してください。これらのアルゴリズムは、以下の特徴を持っています:

  • ソルトの自動生成:ユーザーごとに異なるソルトを自動で生成
  • ストレッチング:ハッシュ計算を意図的に遅くし、ブルートフォース攻撃を困難にする
  • コスト調整:計算コストを調整でき、将来のハードウェア性能向上に対応可能

⚠️ 重要な注意事項

ハッシュ関数は「一方向性」であるため、データの復元はできません。暗号化のように元に戻す必要がある場合は、AESなどの暗号化アルゴリズムを使用してください。また、機密情報をハッシュ化しても、辞書攻撃やブルートフォース攻撃のリスクは残るため、適切なソルトとストレッチングが必須です。

よくある質問(FAQ)

Q1.ハッシュ関数と暗号化の違いは何ですか?
ハッシュ関数は「一方向性」の変換で、元のデータに戻すことができません。一方、暗号化は「双方向性」で、復号化によって元のデータに戻すことができます。ハッシュ関数はデータの検証や整合性チェックに使用され、暗号化はデータの秘匿性を保つために使用されます。パスワード保存にはハッシュ関数を使用し、通信データの保護には暗号化(AES、RSAなど)を使用するのが一般的です。
Q2.MD5はまだ使えますか?
セキュリティ目的での使用は推奨されません。MD5は衝突攻撃(異なるデータから同じハッシュ値を生成する攻撃)に対して脆弱であることが証明されています。そのため、パスワードハッシュやデジタル署名などのセキュリティ用途には使用すべきではありません。ただし、ファイルの一意性チェックや非セキュリティ目的での識別子生成など、セキュリティが重要でない用途では今でも使用されています。
Q3.SHA-256とSHA-512のどちらを使うべきですか?
ほとんどの用途ではSHA-256で十分です。SHA-512は256ビットよりも長いハッシュ値(512ビット)を生成するため、より強力なセキュリティを提供しますが、処理速度は若干遅くなります。パスワードハッシュには、SHA-256/512を直接使用するのではなく、bcrypt、scrypt、Argon2などの専用アルゴリズムを使用することが推奨されます。ファイル検証やデジタル署名には、SHA-256が広く使用されており、現時点で十分に安全です。
Q4.ソルト(Salt)とは何ですか?
ソルトとは、パスワードをハッシュ化する前に追加するランダムな文字列です。同じパスワードでも、ソルトが異なればハッシュ値も異なるため、レインボーテーブル攻撃(事前に計算されたハッシュ値のデータベースを使った攻撃)を防ぐことができます。例えば、「password123」というパスワードに「x7k2p9」というソルトを追加すると「password123x7k2p9」となり、これをハッシュ化します。ユーザーごとに異なるソルトを生成することで、同じパスワードを使用している複数のユーザーでもハッシュ値が異なります。
Q5.ハッシュ値の長さは何文字ですか?
ハッシュアルゴリズムによって異なります。MD5は32文字(128ビット)、SHA-1は40文字(160ビット)、SHA-256は64文字(256ビット)、SHA-512は128文字(512ビット)の16進数文字列で表現されます。例えば、SHA-256で「Hello」をハッシュ化すると「185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969」という64文字の文字列が生成されます。

まとめ

ハッシュ関数は、パスワード保存、ファイル検証、デジタル署名など、現代のセキュリティ技術において欠かせない存在です。当サイトの無料ハッシュ生成ツールを使えば、テキストを簡単にMD5、SHA-1、SHA-256、SHA-512でハッシュ化できます。

本記事のポイント:

  • ハッシュ関数とは:任意の長さのデータを固定長の文字列に変換する一方向性の関数
  • アルゴリズム選択:MD5とSHA-1は非推奨。SHA-256/SHA-512を使用すること
  • 主な用途:パスワードハッシュ、ファイル検証、デジタル署名、ブロックチェーン、トークン生成
  • セキュリティ対策:ソルトの追加、パスワード専用アルゴリズム(bcrypt、scrypt、Argon2)の使用
  • 暗号化との違い:ハッシュは一方向(復元不可)、暗号化は双方向(復号化で元に戻せる)

今すぐハッシュ生成を試してみましょう

無料でハッシュ生成 →
Cookieとデータ利用について

本サイトでは広告配信と利用状況分析のためCookie等を使用します。「同意する」を押すと広告・解析のデータ利用を許可します。設定はいつでもブラウザのCookieを削除して変更できます。

ハッシュ関数の基礎知識|MD5とSHA-256の違い | ムリョウツールズ