SHA-256
SHA-256は、NISTが策定したSHA-2ファミリに属する暗号学的ハッシュ関数であり、任意長の入力から256ビットの固定長ダイジェストを生成する。メッセージ認証、電子署名、改ざん検出、ブロックチェーンなど幅広い分野で用いられ、計算効率と安全性のバランスが良い点が特徴である。内部構造はMerkle–Damgård構成に基づき、512ビットのブロック分割、パディング、圧縮関数の反復でハッシュ値を得る。現在、実用的な衝突攻撃は知られておらず、適切に用いれば長期的な耐性を期待できる。
基本構造と処理手順
SHA-256は入力をビット列として受け取り、1ビットの“1”と必要な“0”を付加し、最後に元の長さ(64ビット)を付加する「パディング」を行う。次に512ビットごとにブロック化し、初期値IV(8つの32ビット語)から開始して圧縮関数を64ラウンド反復する。各ラウンドでは、ワード拡張で得たW[0..63]と、32ビットの回転・シフト・選択関数、加算を組み合わせて内部状態(a..h)を更新し、最終的に8語を連結して256ビット出力を得る。
ラウンド定数Kは素数の立方根の小数部から導出され、拡散と混合の強化に寄与する。実装はビッグエンディアンで定義され、回転演算(ROTR)とビットXORが多用されるため、CPU命令最適化の影響を受けやすい。
安全性と理論的限界
SHA-256の原像探索はおよそ2256、第二原像は2256、衝突は誕生日界により理論上2128の計算量を要する。差分攻撃や中間相関を狙う研究はあるが、現時点で実用的な攻撃は成立していない。耐量子計算の観点ではGroverにより原像複雑度が平方根化されるが、それでも2128相当であり、現実的脅威とは言い難い。
長さ拡張攻撃と対策
SHA-256はMerkle–Damgård構成のため、ハッシュ(m)からハッシュ(m∥pad(m)∥m′)を構成できる長さ拡張攻撃の影響を受ける。これを避けるには、HMACのように鍵付きで用いる、あるいは「ハッシュ化対象に長さや型の明示を含める」「コンテキストストリングを前置する」などのドメイン分離を実施することが有効である。電子署名では署名対象として単純な生ハッシュを露出させず、プロトコル側でエンコード規則を厳密化する。
代表的用途
- 電子署名:RSAやECDSAでメッセージダイジェストとしてSHA-256を用いる。
- メッセージ認証:HMAC-SHA-256はTLSやAPI認証で標準的に採用される。
- 整合性検証:ファームウェア配布やアーカイブ配布の改ざん検出に利用。
- ブロックチェーン:BitcoinはダブルSHA-256をPoWやブロック識別に用いる。
実装と最適化
SHA-256は32ビット演算主体で、分岐の少ないビット演算が中心となる。ARMv8やx86には専用命令(SHA拡張)があり、1サイクル当たりの処理語数が向上する。SIMDを用いた並列化、ループアンローリング、メモリアラインメントの調整によりスループットを改善できる。秘密情報と組み合わせる場合はタイミング差・電磁漏洩など副チャネル対策も重要となる。
テストベクトルと相互運用
代表的な既知値として、空文字列のSHA-256は「e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855」である。実装検証では複数の長さ・偏りを持つ入力でテストし、エンディアンやパディングの実装差異を排除する。規格はFIPS 180-4に定義され、互換性確保には同規格の厳守が不可欠である。
SHA-1・SHA-3との位置付け
SHA-1は衝突が実証され推奨されない。一方、SHA-3はスポンジ構成により長さ拡張攻撃に強い設計であり、代替として選択されることがある。ただし既存エコシステムとハードウェア最適化の広さから、SHA-256は依然として第一選択となる場面が多い。
設計の実務ポイント
- メッセージの正規化:改行コードやシリアライズ形式を固定し、SHA-256入力の一意性を確保する。
- 鍵付き運用:認証用途ではHMAC-SHA-256を用い、単純ハッシュで認証を行わない。
- アルゴリズム可換性:将来の移行に備え、SHA-256以外への切替を許容する枠組みを設ける。