ハッシュ関数の解説
ハッシュ関数は、どんな入力でも短い固定長の「指紋」に変換します。このガイドでは、MD5、SHA-1、SHA-256 が何に役立ち、どこに限界があるのか、そしてファイルを公開されたチェックサムと比較する方法を説明します。
ハッシュとは
暗号学的ハッシュ関数は、任意のサイズのデータを読み込み、固定長のダイジェストを生成します。長さは MD5 が128ビット、SHA-1 が160ビット、SHA-256 が256ビットで、通常は16進数のテキストで表示されます。同じ入力からは毎回同じダイジェストが得られ、入力が1ビット変わるだけでもまったく異なるダイジェストになります。ハッシュは一方向です。入力を推測して結果を比較する以外に、ダイジェストから入力を復元する方法はありません。
このガイドは一般的な情報を提供するものです。セキュリティに関する判断は、所属する組織や利用しているサービスの要件に従ってください。
チェックサムと完全性
日常で最もよく使われるのは、ファイルが壊れずに届いたかを確認する用途です。ダウンロードページでは、ファイルの横に SHA-256 の値が公開されていることがあります。ダウンロード後に手元のファイルのハッシュを計算し、公開されている値と比較します。値が一致すれば、そのファイルは公開者がハッシュを計算したファイルと同一である可能性が非常に高く、異なればダウンロードが破損しているか、別のバージョンのファイルです。
チェックサムが役立つのは、公開されている値自体が信頼できる場合だけです。攻撃者が同じページ上のファイルとチェックサムの両方を変更できるなら、ハッシュが一致してもほとんど何の証明にもなりません。この問題に対処するのがデジタル署名です。
MD5 と SHA-1 がセキュリティに向かない理由
安全なハッシュでは、同じダイジェストを持つ2つの異なる入力(衝突)を見つけることが現実的に不可能でなければなりません。MD5 と SHA-1 のどちらにも実用的な衝突攻撃が公開されており、攻撃者は同じハッシュを持つ2つの異なるファイルを用意できます。このため、これらはデジタル署名、証明書、その他のセキュリティ用途にはもう適さないとされています。
MD5 と SHA-1 は偶発的な破損の検出にはまだ使え、古いシステムの中にはこれらを公開しているものもあります。新しく使う場合は、SHA-256 か、SHA-2 ファミリーのほかのアルゴリズム(SHA-384、SHA-512)を選ぶのが一般的です。
| アルゴリズム | ダイジェストの長さ | 安全性の状況 |
|---|---|---|
| MD5 | 128ビット(16進数32文字) | 衝突耐性が破られている。従来のチェックサム用途のみ |
| SHA-1 | 160ビット(16進数40文字) | 衝突耐性が破られている。従来の用途 |
| SHA-256 | 256ビット(16進数64文字) | 広く使われ、推奨されている |
| SHA-384 / SHA-512 | 384 / 512ビット | 広く使われ、推奨されている |
ハッシュ化は暗号化ではなく、パスワードにはさらに対策が必要
暗号化は正しい鍵があれば元に戻せますが、ハッシュ化は元に戻すことを前提に設計されていません。ただし、ハッシュは短い入力や予測しやすい入力を隠せません。誰でもよく使われる単語や電話番号をハッシュ化し、一致するものを探せるからです。
そのため、MD5 や SHA-256 のような高速なハッシュだけでは、パスワードの保存には適していません。これらは高速に動作するよう設計されているため、攻撃者は非常に多くの推測を短時間で試せます。パスワードの保存には、Argon2、scrypt、bcrypt など、その目的のために作られた低速でソルト付きのアルゴリズムを使います。ログインシステムを作る場合は、汎用のハッシュではなく、保守されているライブラリと、お使いのプラットフォームの最新のガイダンスを利用してください。
メッセージ認証のための HMAC
単純なハッシュはデータが変更されたかどうかを示しますが、誰でも計算し直せます。HMAC(ハッシュベースのメッセージ認証コード)は、HMAC-SHA256 のように、データと秘密鍵を組み合わせます。鍵を知っている人だけが正しい値を生成できるため、受信者はメッセージが鍵の所有者から送られ、改ざんされていないことを確認できます。Webhook や API リクエストの署名によく HMAC が使われます。鍵は秘密にしてください。鍵を持っている人は誰でも有効なコードを作成できます。
同じテキストなのにハッシュが異なる理由
ハッシュは、目に見えるテキストではなくバイト列から計算されます。次のような違いがあると結果が変わります。
- 改行コード: Windows は CR LF を使い、Linux と macOS は LF を使います。
- 文字コード: 「é」は UTF-8 と古い文字コードとで異なるバイト列になります。
- 末尾の改行や空白、またはファイル先頭のバイトオーダーマーク(BOM)。
- 入力の大文字と小文字の違い。
ハッシュが一致しない場合は、まずこれらを確認してください。元のファイルをハッシュ化するほうが、そこからコピーしたテキストをハッシュ化するより通常は確実です。16進数の出力自体は大文字・小文字を区別しません。A1B2 と a1b2 は同じ値です。
よくある質問
MD5 や SHA-256 のハッシュを復号できますか?
いいえ。ハッシュは暗号化されたデータではありません。オンラインの「復号」サービスは、よく使われる入力のハッシュをあらかじめ計算しておき、それを照合しているだけです。単純な値のハッシュでは保護がほとんど得られないのはこのためです。
ダウンロードの検証にはどのアルゴリズムを使うべきですか?
公開者が提供しているものを使ってください。複数提供されている場合は、MD5 や SHA-1 より SHA-256 や SHA-512 を選ぶほうがよいでしょう。
ハッシュ生成ツールはファイルをアップロードしますか?
LeedyBox のハッシュ生成はブラウザ内でハッシュを計算するため、選択したテキストやファイルはお使いの端末で処理されます。