SHA-3とは?
SHA-3(Secure Hash Algorithm 3)は、Secure Hash Algorithmファミリーの最新メンバーであり、2015年にNISTによって公開されました。Merkle-Damgård構築に基づくSHA-2とは異なり、SHA-3はスポンジ構築と呼ばれる根本的に異なる設計を使用しています。この違いにより、SHA-3はSHA-2を脅かす特定のクラスの攻撃に対して耐性を持ちます。
元々Keccak(「ケチャック」と発音)という名前だったこのアルゴリズムは、5年間の公開評価プロセスを経て、2012年にNISTハッシュ関数コンペティションで勝利しました。NISTは4つのハッシュ長(SHA3-224、SHA3-256、SHA3-384、SHA3-512)と、2つの拡張可能出力関数(XOF):SHAKE128およびSHAKE256を標準化しました。
SHA-3の仕組み
SHA-3はスポンジ構築を使用しており、吸収(absorbing)と搾出(squeezing)の2つのフェーズで構成されています。吸収フェーズでは、入力データがブロック単位で内部状態に取り込まれます。搾出フェーズでは、ハッシュ出力が抽出されます。
SHA-3の内部状態は5×5レーンの3D配列で、各レーンは64ビットを含み、合計状態サイズは1600ビットです。Keccak-fと呼ばれる置換関数が、両方のフェーズで状態を混合するために反復的に適用されます。
この設計により、SHA-3にはいくつかの利点があります:
- SHA-2に影響を与える長さ拡張攻撃に対して脆弱ではない
- スポンジ構築はセキュリティ証明を提供する
- ハードウェア実装で優れたパフォーマンスを発揮する
- XOFバリアントは任意の長さの出力を生成する
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-3を使用すべきタイミング
SHA-3はSHA-2を直ちに置き換えることを目的としていません。SHA-2は依然として安全であり、そのセキュリティを許容レベル以下に低下させる実用的な攻撃はありません。SHA-3は、SHA-2が最終的に破られた場合のバックアップとして存在します。
以下の場合にSHA-3を使用してください:
- 長さ拡張攻撃への耐性が必要な場合
- アプリケーションがSHA-3アクセラレーションを備えたハードウェアで動作する場合
- SHA-2から暗号依存関係を多様化したい場合
- 根本的に異なる設計のハッシュ関数が必要な場合(多層防御)
- SHAKE128またはSHAKE256からの可変長出力が必要な場合
コード例
// PHP
echo hash('sha3-256', 'hello');
echo hash('sha3-512', 'hello');
import hashlib
print(hashlib.sha3_256(b'hello').hexdigest())
print(hashlib.sha3_512(b'hello').hexdigest())
# SHAKE (extendable output)
print(hashlib.shake_128(b'hello').hexdigest(16)) # 16 bytes output
print(hashlib.shake_256(b'hello').hexdigest(32)) # 32 bytes output
// 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'));
SHAKE128 と SHAKE256
SHAKE(Secure Hash Algorithm KEccak)は拡張可能出力関数(XOF)です。固定長ハッシュ関数とは異なり、XOFは任意の長さの出力を生成します。SHAKE128は任意の出力長で128ビットのセキュリティを提供し、SHAKE256は256ビットのセキュリティを提供します。
XOFは以下の場合に有用です:
- シードから任意の長さの暗号鍵を生成する
- 暗号化スキームでマスキング値を作成する
- ストリーム暗号と乱数生成器を構築する
オンラインツール
Help2CodeのSHA-3ハッシュジェネレーターは、SHA3-224、SHA3-256、SHA3-384、SHA3-512のハッシュを即座に計算します。マルチハッシュジェネレーターでSHA-2ハッシュと出力を比較できます。
結論
SHA-3は、保守的なセキュリティマージンを備えた、現代的でよく設計されたハッシュ関数です。SHA-2がほとんどのアプリケーションで標準であり続ける一方で、SHA-3は多層防御のためのバックアップハッシュ関数が必要な場合や、SHAKE拡張可能出力関数のユニークな機能が必要な場合に優れた選択肢です。