SHA-3とは?
SHA-3(Secure Hash Algorithm 3)は、2015年にNISTによって公開されたSecure Hash Algorithmファミリーの最新メンバーです。Merkle-Damgård構築に基づくSHA-2とは異なり、SHA-3はスポンジ構築と呼ばれる根本的に異なる設計を使用しています。この違いにより、SHA-3は長さ拡張攻撃に対して耐性を持ち、明確なセキュリティ証明を備えています。
元々Keccak(「ケチャック」と発音)という名前だったこのアルゴリズムは、5年間の公開評価プロセスを経て、2012年にNISTハッシュ関数コンペティションで勝利しました。NISTは4つの固定ハッシュ長(SHA3-224、SHA3-256、SHA3-384、SHA3-512)と、2つの拡張可能出力関数(XOF):SHAKE128およびSHAKE256を標準化しました。
SHA-3の簡単な歴史
SHA-2は2001年に公開され、現在も破られていません。しかしNISTはなぜ全く新しいハッシュ関数のコンペティションを開催したのでしょうか。答えは防御的です。SHA-2はMD5やSHA-1と同じMerkle-Damgård構築を共有しており、その両方が最終的に破られました。NISTは、一方のファミリーの将来の弱点が他方に自動的に波及しないよう、根本的に異なる内部構造を持つ代替を求めました。
Guido Bertoni、Joan Daemen、Michaël Peeters、Gilles Van Asscheによって設計されたKeccakは、2012年10月に選ばれ、2015年8月にFIPS PUB 202として標準化されました。
SHA-3の仕組み
スポンジ構築
SHA-3は固定サイズのブロックで入力を吸収し、その後ダイジェストを「搾出」します。内部的には状態がレート(データを読み書きする部分)と容量(秘密に保たれる部分)に分かれています。SHA3-256ではレートは1088ビット、容量は512ビットで、容量がセキュリティレベルを決定します(容量 ÷ 2)。
Keccak-f置換
内部状態は64ビットのレーンが5×5に並んだグリッドで、合計1600ビットです。Keccak-f[1600] と呼ばれる置換関数が繰り返し(24ラウンド)適用され、状態を混合します。各ラウンドは5つの単純なステップ(θ、ρ、π、χ、ι)を使用し、ハードウェアで低コストであり、暗号解析者にとっても評価しやすい設計です。
主な特性
- SHA-2に影響を与える長さ拡張攻撃に対して脆弱ではない
- スポンジ構築に対するセキュリティ還元によって裏付けられている
- ハードウェア実装で優れた性能、ソフトウェアでも競争力がある
- XOFバリアント(SHAKE)は任意の長さの出力を生成する
SHA-3 vs SHA-2
| 特徴 | SHA-2 | SHA-3 |
|---|---|---|
| 構築方式 | Merkle-Damgård | スポンジ(Keccak) |
| 公開年 | 2001 | 2015 |
| 出力サイズ | 224, 256, 384, 512 | 224, 256, 384, 512 + XOF |
| 長さ拡張 | 脆弱 | 耐性あり |
| ソフトウェア速度 | 高速 | 低速 |
| ハードウェア速度 | 中程度 | 優れている |
| サイドチャネル耐性 | 良好 | より良好 |
どちらが絶対的に「優れている」わけではありません。SHA-2はソフトウェアで高速で長年の実績があり、SHA-3はよりクリーンなセキュリティマージンと異なる故障モードを持ちます。ほとんどのシステムはSHA-2を使い続け、SHA-3は緊急の置き換えではなく、十分にサポートされた代替として扱うべきです。
SHA-3 vs SHA-2 vs BLAKE2
BLAKE2(および後継のBLAKE3)はNIST標準ではありませんが、ソフトウェアで非常に高速なため人気があります。
| アルゴリズム | ファミリー | 一般的な速度 | 標準化 |
|---|---|---|---|
| SHA-256 | Merkle-Damgård | 基準 | NIST(FIPS 180-4) |
| SHA3-256 | スポンジ | SHA-256より低速 | NIST(FIPS 202) |
| BLAKE2b | HAIFA | SHA-256より高速 | RFC 7693(情報提供) |
| BLAKE3 | ツリー/HAIFA | 最速 | コミュニティ仕様 |
環境がすでにNISTアルゴリズムに標準化されているなら、SHA-3が自然な代替です。純粋なスループットが優先され、NIST以外のハッシュが許容されるなら、BLAKE2/BLAKE3のベンチマークを検討してください。
固定長ハッシュとSHAKE
4つの固定出力は、呼び出し側から見るとSHA-2とまったく同じように動作します。
SHA3-224 → 28バイト
SHA3-256 → 32バイト
SHA3-384 → 48バイト
SHA3-512 → 64バイト
SHAKE128とSHAKE256は拡張可能出力関数です。固定のダイジェストではなく、必要なだけのバイト数を要求します。これにより以下の用途に役立ちます。
- シードから任意の長さの暗号鍵を導出する
- ストリーム暗号と決定論的乱数生成器を構築する
- XOFのカスタマイズ文字列によるドメイン分離
コード例
// PHP
echo hash('sha3-256', 'hello'); // 32バイトの16進ダイジェスト
echo hash('sha3-512', 'hello'); // 64バイトの16進ダイジェスト
import hashlib
print(hashlib.sha3_256(b'hello').hexdigest())
print(hashlib.sha3_512(b'hello').hexdigest())
# SHAKE(拡張可能出力)
print(hashlib.shake_128(b'hello').hexdigest(16)) # 16バイト出力
print(hashlib.shake_256(b'hello').hexdigest(32)) # 32バイト出力
// Node.js
const crypto = require('crypto');
console.log(crypto.createHash('sha3-256').update('hello').digest('hex'));
console.log(crypto.createHash('sha3-512').update('hello').digest('hex'));
# OpenSSL CLI
printf 'hello' | openssl dgst -sha3-256
SHA-3を使用すべきタイミング
SHA-3はSHA-2を直ちに置き換えることを目的としていません。SHA-2は依然として安全であり、そのセキュリティを許容レベル以下に低下させる実用的な攻撃はありません。SHA-3は、SHA-2が最終的に破られた場合のバックアップとして存在します。
以下の場合にSHA-3を使用してください:
- 長さ拡張攻撃への耐性が必要な場合(ハッシュをMACプレフィックスとして使う場合など)
- アプリケーションがSHA-3アクセラレーションを備えたハードウェアで動作する場合
- SHA-2から暗号依存関係を多様化したい場合
- 根本的に異なる設計のハッシュ関数が必要な場合(多層防御)
- SHAKE128またはSHAKE256からの可変長出力が必要な場合
SHA-3をパスワードハッシュ関数として使用しないでください。SHA-2と同様に高速になるよう設計されているため、パスワードの保存には適していません。代わりにBcrypt、scrypt、Argon2を使用してください。
よくある間違い
- パスワードに単純なハッシュを使用する。 高速ハッシュ(SHA-2、SHA-3)はパスワードハッシュではありません。低速でソルト付きのKDFを使用してください。
- セキュリティレベルを理解せずにダイジェストを切り詰める。 切り詰めたSHA3-256はSHA3-224と同じではありません。
- 自分のスタックでSHA-3が常に遅いと決めつける。 実行環境でベンチマークしてください。
- SHAKEを通常のハッシュと混同する。
shake128は明示的な出力長を必要とします。 - ファイル内容をテキストとしてハッシュする。 改行コードの変換がダイジェストを静かに変えてしまいます。
よくある質問
SHA-3はSHA-2より安全ですか? どちらも安全と見なされています。SHA-3は理論的なマージンが強く長さ拡張攻撃に耐性がありますが、SHA-2にも実用的な破綻はありません。重要なのはハッシュの使い方です。
アプリケーションをSHA-2からSHA-3へ移行すべきですか? 緊急ではありません。具体的な利点(長さ拡張耐性、SHAKE、ハードウェアアクセラレーション)が得られる箇所で移行してください。
Keccak-256とは何ですか? Keccak-256は、異なるパディングを持つ元のコンペティション版です。Ethereumで使用されており、NISTのSHA3-256とは同一ではありません。
SHA-3をHMACに使用できますか? はい。HMAC-SHA3は標準化されています(NIST SP 800-185、KMACと併せて)。新しいシステムではKMACの方がしばしばクリーンな選択です。
SHA-3は量子耐性がありますか? ハッシュ関数単体では完全なポスト量子の答えにはなりません。Groverのアルゴリズムは実効セキュリティレベルをおおよそ半分にするため、SHA3-256は約128ビットのポスト量子耐性を提供します。
オンラインツール
Help2CodeのSHA-3ハッシュジェネレーターは、SHA3-224、SHA3-256、SHA3-384、SHA3-512のハッシュをブラウザ上で即座に計算します。マルチハッシュジェネレーターでSHA-2ハッシュと出力を比較したり、ハッシュチェッカーで既存のダイジェストを検証できます。
結論
SHA-3は、保守的なセキュリティマージンを備えた、現代的でよく設計されたハッシュ関数です。SHA-2がほとんどのアプリケーションで標準であり続ける一方で、SHA-3は多層防御のためのバックアップハッシュ関数、長さ拡張攻撃への耐性、またはSHAKE拡張可能出力関数のユニークな機能が必要な場合に優れた選択肢です。