SHA-2は、データの改ざん検知や整合性確認に広く使われている暗号学的ハッシュ関数(ハッシュ関数ファミリー)です。任意の長さの入力データから固定長のハッシュ値を生成し、入力が少しでも変わると出力が大きく変化します。この性質を利用して、ファイル配布時の改ざん確認、電子署名、証明書(PKI)などの場面で重要な役割を担っています。
一方で、ハッシュは「それ自体が改ざんを防ぐ」仕組みではありません。ハッシュ値の配布経路が改ざんされると検知できないため、署名(電子署名)やHMACなど、検証手段を信頼できる形で組み合わせることがポイントです。本記事では、SHA-2の基本、仕組み、用途、そして“正しく使う”ための実務上の注意点までを、短時間で押さえられるように整理します。
SHA-2とは、入力データから固定長のハッシュ値(ダイジェスト)を計算するための、暗号学的ハッシュ関数の標準です。暗号学的ハッシュ関数は、単なる「要約」ではなく、改ざん検知や真正性確認の基盤として使えるように設計された関数を指します。
SHA-2は、2001年にNISTが標準として公開したハッシュ関数ファミリーです。代表的な特徴は次の通りです。
暗号学的ハッシュ関数は、主に次の用途で使われます。
「改ざん検知に使える」というのは、ハッシュ値そのものが信頼できる経路で管理・配布される場合に限ります。この前提を外すと、ハッシュ比較の意味が薄れる点が実務では重要です。
SHA-2には複数のバリエーションがあり、出力長(ビット長)が異なります。
| アルゴリズム | ハッシュ値のビット長 |
|---|---|
| SHA-224 | 224ビット |
| SHA-256 | 256ビット |
| SHA-384 | 384ビット |
| SHA-512 | 512ビット |
| SHA-512/224 | 224ビット |
| SHA-512/256 | 256ビット |
一般に、出力長が長いほど衝突探索の難易度が上がります(衝突探索の目安は誕生日攻撃により概ね2^(n/2))。ただし、用途によって必要十分な強度や計算コストが異なるため、単純に「長ければ良い」とは限りません。
現時点で、SHA-2(フルラウンド)に対して実運用を崩すような実用的攻撃が一般に確認されているわけではなく、多くのプロトコルや製品で標準的に利用されています。ただし、暗号の安全性は永続的に保証されるものではありません。新たな解析手法や計算資源の進歩(例:量子計算による探索加速)を見据え、長期利用を前提とする設計では出力長の選定や移行計画を含めて考えることが現実的です。
SHA-2は、入力を一定サイズのブロックに分割して処理し、内部状態(ハッシュ値)を更新していく構造(Merkle–Damgård型)を持ちます。入力長に関係なく固定長出力を得られるのは、この「ブロック処理+状態更新」を繰り返すためです。
大まかな流れは次の通りです。
ブロック長は固定ではありません。SHA-224/256は512ビット単位、SHA-384/512(およびSHA-512派生)は1024ビット単位で処理します。
SHA-2が「入力が少し変わると出力が大きく変わる」のは、各ラウンドでビット演算と加算、ローテートなどを繰り返し、入力ブロックの影響が内部状態全体に拡散するよう設計されているためです。この性質により、ハッシュ値は改ざん検知の指紋として扱いやすくなります。
SHA-2の内部には、主に次の要素があります。
細部の数式を覚える必要はありません。重要なのは、設計として「逆算しづらい」「衝突を作りづらい」「僅かな変更が全体に拡散する」ように組まれている点です。
ハッシュ値は固定長である以上、理論上は衝突が必ず存在します。したがって重要なのは「衝突を見つけるのが現実的に無理なコストである」ことです。一般にnビットのハッシュで衝突を探す難易度は誕生日攻撃を基準に概ね2^(n/2)が目安となるため、用途に応じて出力長(SHA-256/384/512など)を選定します。
ファイル配布やバックアップの検証で、SHA-2は定番です。配布元が公開したハッシュ値と、受け取ったファイルのハッシュ値を比較することで、転送中や保存中に改ざん・破損が起きていないかを確認できます。
ただし、ハッシュ値を掲載しているページ自体が改ざんされると比較の意味がなくなります。実務では、ハッシュ値の配布経路を署名やTLS、別チャネルなどで補強するのが基本です。
パスワードの保存では「平文保存しない」は大前提ですが、注意点があります。SHA-2は高速に計算できるため、パスワード用途でSHA-256等を“そのまま”使うと、総当たり(オフライン攻撃)が進みやすいという弱点があります。
パスワードは、一般に次のような手段で扱うのが安全です。
「SHA-2は万能」ではなく、用途に合わせて道具を選ぶのが正しい運用です。
電子署名では、文書全体に直接署名するのではなく、まず文書のハッシュ値を計算し、そのハッシュ値に署名する構成が一般的です。これにより、巨大なデータでも効率よく署名・検証ができ、改ざん検知と送信者確認を同時に成立させられます。PKIでは、証明書の署名や検証の過程でSHA-2が利用される場面が多く、TLSなどの安全な通信の裏側を支えています。
ブロックチェーンでは、各ブロックの内容をハッシュ化し、そのハッシュを次のブロックに組み込むことで、改ざんに強い連鎖構造を作ります。ビットコインではSHA-256が利用されており、取引データの整合性やブロック生成の仕組みに関わっています。
一般的な整合性確認や署名用途ではSHA-256がよく使われます。一方で、長期にわたり強度を確保したい、あるいは余裕を見たい場合にはSHA-384やSHA-512が選択肢になります。重要なのは「何から守りたいか(衝突か、原像か)」「どのくらいの寿命を想定するか」を前提に決めることです。
ソルトは、同じパスワードでもユーザーごとにハッシュが変わるようにするためのランダム値です。これにより、レインボーテーブルのような事前計算型攻撃への耐性が上がります。ただし、前述の通りパスワードはSHA-2単体ではなく、KDF(PBKDF2 / bcrypt / scrypt / Argon2)を使うのが基本です。
オフライン攻撃の本質は「大量に試せる」点にあります。対策の考え方は次の通りです。
ファイルの改ざん検知をしたいなら、ハッシュ値を「信頼できる方法」で配布・保管する必要があります。配布元が署名したハッシュを提示する、HMACを使う、TLSや別チャネルでハッシュを共有するなど、運用設計がセットです。
暗号技術は固定ではありません。将来の解析進展や計算資源の変化に備え、アルゴリズムの移行が可能な実装(暗号スイートの更新、設定変更で切り替えられる設計、期限管理など)にしておくと、後から困りにくくなります。
SHA-2は、改ざん検知や署名、PKIなどの基盤として広く使われる、信頼性の高い暗号学的ハッシュ関数ファミリーです。ただし「ハッシュ=完全性保証」ではなく、ハッシュ値の配布経路の信頼性や、用途に応じた手段(署名、HMAC、パスワード向けKDFなど)との組み合わせが重要です。目的に合わせて適切に使い分けることで、SHA-2はセキュリティ設計の強い味方になります。
SHA-2はハッシュ関数ファミリーの総称で、SHA-256はその一種(出力長256ビット)です。用途や必要な強度に応じてSHA-384やSHA-512を選ぶこともあります。
改ざんを“防止”するというより、改ざんを“検知”するために使います。ハッシュ値の配布経路が信頼できる(署名・HMAC・TLS等で担保される)ことが前提です。
現実的な計算量では困難です。ハッシュは一方向性(原像計算困難性)を前提に設計されており、ハッシュ値から元データを戻す用途には使いません。
異なる入力が同じハッシュ値になる組み合わせ(衝突)を見つけにくい性質です。一般にnビットのハッシュでは誕生日攻撃を基準に概ね2^(n/2)が衝突探索の目安になります。
推奨されにくい場面が多いです。SHA-256は高速なため総当たり(オフライン攻撃)が進みやすく、パスワード用途ではPBKDF2/bcrypt/scrypt/Argon2などのKDFを使うのが基本です。
同じパスワードでもユーザーごとにハッシュ値を変えるためです。これにより、レインボーテーブルのような事前計算型攻撃への耐性が上がります。
違います。SHA-224/256は512ビット単位、SHA-384/512(およびSHA-512派生)は1024ビット単位でブロック処理を行います。
文書そのものではなく、文書のハッシュ値を計算し、そのハッシュ値に署名する形が一般的です。効率よく改ざん検知と送信者確認を成立させられます。
多くの用途でSHA-2は依然として標準的に使われています。新規設計や長期運用では、要件や規格、互換性を踏まえてSHA-3を含めて選定する、という整理が現実的です。
ハッシュ値の掲載ページや配布チャネルが改ざんされると検知できません。署名付きで提供する、別チャネルで共有する、TLSで保護するなど、ハッシュ値の信頼性を担保する運用が重要です。