SHA-2は、データが途中で書き換わっていないかを確かめるときによく使うハッシュの方式です。元のデータから決まった長さの値を作り、入力が少しでも変わると結果も大きく変わります。この性質を使って、ファイル配布時の確認、電子的な署名、証明書の仕組みなどで広く使われています。
この記事では、SHA-2の基本、仕組み、よくある使い道、そして安全に使うときの注意点を短時間で全体を見ていきます。
SHA-2とは、入力データから決まった長さのハッシュ値を計算するための標準です。NISTが定めた Secure Hash Standard では、SHA-224、SHA-256、SHA-384、SHA-512に加え、SHA-512/224、SHA-512/256も扱われています。
SHA-2の主な特徴は次の通りです。
ハッシュは主に次の場面で使われます。
ただし、ハッシュ値だけ配っても十分とは限りません。その値を載せたページや渡し方まで信頼できる形で守られていなければ、比較しても意味が薄れるためです。
SHA-2には複数の種類があり、出力の長さが異なります。
| アルゴリズム | ハッシュ値の長さ |
|---|---|
| SHA-224 | 224ビット |
| SHA-256 | 256ビット |
| SHA-384 | 384ビット |
| SHA-512 | 512ビット |
| SHA-512/224 | 224ビット |
| SHA-512/256 | 256ビット |
出力が長いほど、同じ値になる組み合わせを探す難しさは上がります。もっとも、必要な強さや計算量は使い道で変わるため、長いものを選べば常に最善というわけではありません。
SHA-256はSHA-2ファミリーの一つです。つまり「SHA-2」と「SHA-256」は同じ意味ではなく、前者が総称、後者が個別の方式です。
一方、SHA-3は別系統の標準です。現在も多くの場面ではSHA-2が広く使われており、SHA-3がすぐに置き換える関係ではありません。要件、互換性、使っている製品や規格に合わせて選ぶ必要があります。
SHA-2は、入力を一定の大きさで区切って順に処理し、途中の状態を更新しながら最後の結果を作ります。入力の長さが違っても決まった長さの値になるのは、この繰り返し処理によるためです。
処理に使うブロックの大きさは共通ではありません。SHA-224とSHA-256は512ビット単位、SHA-384とSHA-512、およびSHA-512から派生した方式は1024ビット単位で処理します。
SHA-2では、各段階でビット演算、加算、回転などを繰り返し、入力の影響が全体へ広がるように作られています。そのため、元データを少し変えただけでも、最後のハッシュ値は大きく変わります。
出力の長さが決まっている以上、理論上は違う入力から同じ値になる組み合わせがあります。ただし、都合よく見つけるのが難しいことが重要です。
一般に、nビットのハッシュで同じ値になる組み合わせを探す難しさは、バースデー攻撃を基準におおむね 2^(n/2) が目安です。そのため、必要な強さに応じてSHA-256、SHA-384、SHA-512などを選びます。
ファイル配布やバックアップの確認で、SHA-2は定番です。配布元が示したハッシュ値と、受け取ったファイルから計算したハッシュ値を比べることで、途中で書き換わったり壊れたりしていないかを確認できます。
ただし、ハッシュ値を載せたページ自体が書き換えられると比較の意味がなくなります。日々の運用では、署名、TLS、別の手段などを組み合わせて、ハッシュ値の渡し方も守るのが基本です。
パスワードを平文のまま保存しないことは大前提です。ただし、SHA-256などをそのまま一回だけ使うやり方は勧めにくい運用です。計算が速いため、漏えい後の総当たりを進めやすくしてしまうためです。
パスワードを保存するときは、ソルトを付けたうえで、コストを持つ適切なパスワードハッシュ方式を使う必要があります。日々の運用ではPBKDF2、bcrypt、scrypt、Argon2のような、パスワード向けの方式を使うことが多くなっています。
電子的な署名では、文書そのものにそのまま署名するのではなく、まず文書のハッシュ値を計算し、その値に署名する形がよく使われます。これにより、大きなデータでも扱いやすくなり、書き換えの検知と送信者の確認を効率よく行えます。
証明書の仕組みでも、署名や検証の場面でSHA-2が使われることが多く、TLSなど安全な通信の土台を支えています。
ブロックチェーンでは、各ブロックの内容からハッシュ値を作り、その値を次のブロック側で参照することで、後から書き換えにくい連なりを作ります。ビットコインではSHA-256が使われており、取引データの確認やブロック生成の処理に関わっています。
一般的なファイル確認や署名ではSHA-256がよく使われます。一方で、長く使う前提で余裕を持たせたい場合は、SHA-384やSHA-512を選ぶこともあります。大事なのは、何に備えるのか、どのくらい長く使うのかを先に決めることです。
ソルトは、同じパスワードでも利用者ごとに違うハッシュ値になるように加えるランダム値です。これにより、事前にたくさんの計算をした表をそのまま使う攻撃を受けにくくできます。
要するに、攻撃側が一気に何度も試しにくい形へ持っていくことが重要です。
ファイルが書き換わっていないかを見たいなら、ハッシュ値をどう配るかまで設計に含める必要があります。署名付きで配る、HMACを使う、TLSで守る、別の手段でも共有する、といった運用がセットです。
暗号の世界では、今の安全性が永遠に続くとは限りません。後から方式を切り替えられる実装や設定にしておくと、将来の見直しがしやすくなります。
SHA-2は、データが書き換わっていないかを確かめる場面や、署名、証明書の仕組みなどで広く使われているハッシュの標準です。ただし、ハッシュを計算するだけで十分とは限りません。ハッシュ値をどう配るか、パスワードではどの方式を使うかまで含めて考えることで、SHA-2をより安全に使いやすくなります。
同じではありません。SHA-2は方式全体の名前で、SHA-256はその中の一つです。
正確には、改ざんそのものを防ぐというより、変化を見つけるために使います。ハッシュ値の渡し方まで信頼できることが前提です。
現実的な時間では難しいと考えられています。そのため、元データを隠したまま確認に使えます。
理論上はあります。ただし、都合よく見つけるのが難しいことが重要です。
勧めにくい使い方です。パスワード向けの方式を選び、ソルトとコスト設定も合わせて使う方が安全です。
同じパスワードでも利用者ごとに違う結果にするためです。事前に作られた表をそのまま使う攻撃を受けにくくできます。
違います。前者は512ビット単位、後者は1024ビット単位で処理します。
文書そのものではなく、まずハッシュ値を計算し、その値に署名する形で使われることが一般的です。
多くの場面では今もSHA-2が広く使われています。要件、互換性、規格に合わせて選ぶのが現実的です。
ハッシュ値を載せたページや渡し方が書き換えられると比較の意味がなくなります。署名やTLS、別の手段を組み合わせることが重要です。