セキュリティ

ハッシュ関数をやさしく解説:MD5・SHA-1・SHA-256の違いと正しい使い方

ダウンロードのチェックサム、Gitのコミット ID、ブロックチェーンのアドレスはすべてハッシュ値です。このガイドでは、ハッシュと暗号化の違いと、用途ごとにどのアルゴリズムを選ぶべきかを説明します。

ハッシュ関数とは

ハッシュ関数は、任意の長さの入力から固定長の短い値を作ります。これをハッシュ値またはダイジェストと呼びます。1単語でも数ギガバイトの動画でも、SHA-256の出力は常に256ビット、つまり16進数64文字です。

重要なのは、ハッシュが一方向だという点です。ハッシュ値から元の入力を計算する方法はありません。鍵があれば元に戻せる暗号化や、誰でも元に戻せるBase64との決定的な違いがここにあります。

良いハッシュの3つの性質

セキュリティ用途で使う暗号学的ハッシュ関数は、次の条件を満たす必要があります。

  • 決定性:同じ入力からは常に同じハッシュが得られる。
  • 雪崩効果:1文字変えるだけで出力がまったく変わる。下の例の hello と hello! を比べてみてください。
  • 衝突耐性:同じハッシュになる2つの異なる入力を見つけることが事実上不可能である。
SHA-256("hello")  = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hello!") = ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b
MD5("hello")      = 5d41402abc4b2a76b9719d911017c592

大文字と小文字も区別されます。Hello と hello はまったく関係のないハッシュになります。ハッシュを比較するときは、空白、改行、大文字小文字まで入力が完全に一致しているかを先に確認しましょう。

MD5、SHA-1、SHA-256の比較

MD5は128ビット(16進数32文字)のダイジェストを出力します。高速ですが、2004年から実用的な衝突攻撃が知られているため、セキュリティ用途には使ってはいけません。偶発的な破損を検出する簡易チェックサムとしてなら今でも使えます。

SHA-1は160ビットを出力します。2017年、GoogleとCWIの研究者が同じSHA-1ハッシュを持つ2つの異なるPDFファイルを公開し(SHAttered)、セキュリティ用途での利用に終止符が打たれました。ブラウザーや認証局はもうSHA-1の証明書を信頼しません。

SHA-256はSHA-2ファミリーに属し、256ビットを出力します。ソフトウェアのチェックサム、TLS証明書、ブロックチェーンの事実上の標準です。新しいシステムでは、SHA-256以上を選ぶのが基本です。

チェックサムでファイルを検証する

ダウンロードページには、ファイルの横にSHA-256の値が載っていることがよくあります。ダウンロードしたファイルのハッシュを計算して比較しましょう。転送中に1ビットでも変わったり改ざんされたりしていれば、ハッシュはまったく違う値になります。

チェックサムがファイルと同じサーバーにある場合、攻撃者は両方を差し替えられます。そのため重要なソフトウェアは、チェックサムファイルにGPGで署名したり、別のHTTPS経路で公開したりしています。

パスワードに素のSHA-256を使ってはいけない理由

ハッシュが一方向なら、パスワードをSHA-256で保存すれば安全に思えますが、そうではありません。SHA-256は高速に動くよう設計されており、GPU 1枚で毎秒数十億回のハッシュを計算できます。ハッシュの一覧を盗んだ攻撃者は、よく使われるパスワードを猛烈な速さで試せます。

bcrypt、scrypt、Argon2のように、あえて低速に作られた専用の関数を使いましょう。これらはパスワードごとに固有のランダムなソルトを混ぜるため、同じパスワードでも保存される値が異なり、事前計算されたレインボーテーブルも無効になります。

ハッシュ、HMAC、暗号化のどれを使うか

AIBIZAPのハッシュ生成ツールで同じ文を複数のアルゴリズムにかけ、1文字変えたときに結果がどれだけ変わるかを確かめてみてください。データを隠して後で元に戻したい場合は、AES暗号化テスターを試しましょう。

  • データが変わっていないか確認する:SHA-256ハッシュ。
  • 共有の秘密鍵を持つ相手から届いたメッセージか確認する:HMAC-SHA256(Webhookや APIリクエストの署名)。
  • パスワードを保存する:bcrypt、scrypt、Argon2。
  • データを隠して後で読み戻す:AES-GCMなどの暗号化。

このツールで試してみましょう

その他のガイド

すべてのガイド