SHA-2 (Secure Hash Algorithm 2) について
SHA-2は、
暗号学的ハッシュ関数の一種であり、その名の通りSHA(Secure Hash Algorithm)シリーズに属します。
SHA-1の後継として、米国国家安全保障局(NSA)によって設計され、2001年に
アメリカ国立標準技術研究所(NIST)によってFIPS PUB 180-4として標準化されました。
SHA-2の概要
SHA-2は、
SHA-1から大幅に改良されており、ハッシュ長の柔軟性が大きな特徴です。以前のハッシュ関数では、ハッシュ長が固定で、それによってセキュリティ強度も決まっていましたが、SHA-2では複数のバリエーションが存在します。
具体的には、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256の6種類があり、それぞれハッシュ長は224、256、384、512ビットとなっています。
SHA-256とSHA-512は、内部構造はほぼ同じですが、それぞれ32ビットと64ビットのワード長で計算されます。ラウンド数やシフト量、追加定数が異なりますが、本質的なアルゴリズムは共通です。SHA-224とSHA-384は、それぞれSHA-256とSHA-512を切り詰めたもので、初期値のみが異なります。SHA-512/224とSHA-512/256は、SHA-512を切り詰めたバージョンです。
これらのアルゴリズムは、
アメリカ合衆国の特許によって保護されていますが、米国政府は
ロイヤリティフリーで開放しています。
SHA-3 の登場とSHA-2
2004年に
MD5、SHA-0の衝突攻撃が成功し、2005年には
SHA-1に対する攻撃法も発表されたため、NIST主導でSHA-3の開発が始まりました。SHA-3は2015年8月に標準化されましたが、SHA-2は現在も広く利用されています。
2014年1月の時点では、
SHA-1に対する有効な攻撃をSHA-2に拡張することはできていません。原像攻撃ではSHA-256で52ラウンド、SHA-512で57ラウンドまで、衝突攻撃ではSHA-256の46ラウンドまでが最良の攻撃法となっています。
SHA-2は、日本の
CRYPTRECやヨーロッパの
NESSIEでも推奨
暗号として採用されています。
ハッシュ関数の標準化
FIPS PUB 180-2では、SHA-256、SHA-384、SHA-512の3つのハッシュ関数が追加され、これらがSHA-2として総称されます。
2002年8月にはFIPS PUB 180-2が新たな標準として認定され、FIPS PUB 180-1(
SHA-1)を置き換えました。2004年にはSHA-224が追加され、2008年のFIPS PUB 180-3で正式に標準となりました。2012年には、SHA-512の切り詰め版であるSHA-512/224とSHA-512/256が追加されました。
また、リアルタイム処理のために、入力データのパディングに関する制限が緩和され、音声や映像などのコンテンツ生成と同時にハッシュ計算を行うことが可能になりました。
2011年、NISTは連邦政府機関におけるセキュリティ強度の下限を112ビット(SHA-224相当)に引き上げました。
2012年、NISTはSHA-3の選定を行いましたが、SHA-3はSHA-2とは異なる構造を持っています。
SHA-2の用途
SHA-2は、TLS/SSL、OpenPGP、SSH、
S/MIME|S_MIME、IPsec、Bitcoinなど、広範なアプリケーションやプロトコルで利用されています。
SHA-256は、Debian GNU/
Linuxのソフトウェアパッケージの認証や
DKIMでのメッセージ署名に、SHA-512は、
ルワンダ国際戦犯法廷でのビデオアーカイブ認証に使用されています。また、DNSSECでの利用も提案されています。
パスワードの安全なハッシュ化にも、SHA-256やSHA-512への移行が進んでいます。
米国では、機密情報を扱う際に法律でSHA-2の使用が義務付けられており、NISTは
SHA-1の使用を中止し、SHA-2を使用することを推奨しています。
SHA-2に対する攻撃と認証
ハッシュ関数に対する攻撃には、原像攻撃と衝突攻撃があります。原像攻撃は、与えられたハッシュ値に対応する元のメッセージを見つける攻撃で、衝突攻撃は、同じハッシュ値を持つ2つの異なるメッセージを見つける攻撃です。
SHA-3選定を契機に、SHA-2への新たな攻撃が報告されていますが、現時点ではフルバージョンのSHA-2への攻撃は成功していません。
また、NISTとCSECによる認証プログラムを通じて、SHA-2の実装が認証されており、SHA-256については1300以上、SHA-512については900以上の実装が認証されています。
ハッシュ値の例
以下に、空の入力に対する各SHA-2ハッシュ関数のハッシュ値を示します。
- - SHA224(""): `0xd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f`
- - SHA256(""): `0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`
- - SHA384(""): `0x38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b`
- - SHA512(""): `0xcf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e`
- - SHA512/224(""): `0x6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4`
- - SHA512/256(""): `0xc672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a`
入力メッセージにわずかな違いがあると、出力されるハッシュ値は大きく変化します。
SHA-256 アルゴリズムの疑似コード
(疑似コードは省略)
SHA-2の比較
各SHA-2アルゴリズムのパフォーマンスは、使用環境に依存します。SHA-256は32ビット計算向けですが、64ビットプロセッサでも最適化の恩恵を受けます。SHA-512は、64ビット環境でより効率的に動作します。
実装ライブラリ
SHA-2は、以下のライブラリでサポートされています。
- - Botan
- - Bouncy Castle
- - cryptlib
- - Crypto++
- - Libgcrypt
- - Mbed TLS
- - libsodium
- - Nettle
- - LibreSSL
- - OpenSSL
- - GnuTLS
- - wolfSSL
SHA-2は、現代の
暗号技術において重要な役割を担っており、今後も広く利用されていくと考えられます。