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-256ではなくSHA-512を切り詰めたバージョンである。SHA-2シリーズは US 6829355 によってカバーされているが、アメリカ合衆国は、この特許をロイヤリティフリーで開放している。
2004年にMD5とSHA-0の強衝突耐性が突破され、SHA-1も攻撃法の研究が進む、といった事態が起きたため、それら強度が低下した関数の非推奨化といった「過去を向いた対策」と同時に、新たな構造を持つようなSHA-3の公募などといった「未来を向いた対策」も進められたが、SHA-2にはSHA-1と類似する点もあるものの、後述するように当時憂慮されたような事態にはなっていない（2015年6月現在）ため、SHA-3を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において、3つのハッシュ関数がSHAシリーズに追加された。これらは出力されるハッシュ長のビット数からそれぞれSHA-256、SHA-384、SHA-512と呼ばれ、SHA-2と総称される。
アルゴリズムは2001年のFIPS PUB 180-2の草稿にて発表され、レビューやコメントが寄せられた。2002年8月、FIPS PUB 180-2は新たな標準 "Secure Hash Standard" として認定され、1995年に制定されたFIPS PUB 180-1を置き換えた。FIPS PUB 180-2には、180-1で規定されたSHA-1も含まれている。
2004年2月、FIPS PUB 180-2のChange Noticeとして、鍵を2つ用いるトリプルDESの鍵長に合うように定義されたSHA-224が追加された。2008年10月、FIPS PUB 180-3が制定されたが、これはSHA-224をChange Noticeから標準自体に取り込むほかには本質的な変化はなかった。この更新は、ハッシュ関数のセキュリティ情報の更新と、これらSHA-2をSpecial Publications 800-107および800-57において使用することを推奨するためのものであった。詳細なテストデータとハッシュの例が標準から除去され、別文書とされた。
2011年1月、NISTはSP800-131Aを発表した。これは、連邦政府組織におけるセキュリティ強度の下限について、それまでの80ビット（SHA-1によって得られる強度）の使用を2013年末までに限定し、それ以降は112ビット（SHA-224によって得られる強度）を下限とするものである。
2012年3月、FIPS PUB 180-4が制定され、SHA-512を切り詰めたバージョンとしてSHA-512/224とSHA-512/256が追加された。また、入力データのパディングをハッシュ計算の前に行なうこととしていた制限が撤廃され、リアルタイムでの音声や映像などにおけるハッシュ計算をコンテンツ生成と同時に行うことが可能となった。最終ブロックのパディングのみは、引き続きハッシュ出力の前に行なうこととされている。
2012年7月、NISTは暗号鍵管理に関するガイドラインであるSP800-57を改訂した。これは、2007年版のおいて112ビット未満の電子署名の生成を2010年末までとしていたものを2013年までに変更するものである。2012年8月にはSP800-107にも同様の変更がなされた。
NISTは2012年に、かねてからコンペティションを進行させていたSHA-3の選出を行った。コンペティションの趣旨により（詳細はSHA-3の記事などを参照）SHA-3はSHA-2（およびそれ以前の関数）とは類似しないものになっている。

用途

SHA-2ハッシュ関数は、TLS/SSL、OpenPGP、SSH、S/MIME、IPsec、Bitcoinといった広く使われているアプリケーションやプロトコルで利用されている。SHA-256は、Debian GNU/Linuxのソフトウェアパッケージの認証や、DKIMにおけるメッセージ署名標準として利用されている。SHA-512は、ルワンダ国際戦犯法廷におけるビデオアーカイブの認証に用いられている。SHA-256およびSHA-512は、DNSSECでの利用が提唱されている。UnixやLinuxのベンダーでは、パスワードの安全なハッシュ法としてSHA-256やSHA-512への移行を始めている。
SHA-1とSHA-2は、アメリカ合衆国において機密情報を扱う際に法律によって要求されるハッシュアルゴリズムの一つである。FIPS 180-1では、SHA-1を私的にあるいは商業で用いることも推奨している。SHA-1は合衆国政府での利用はほぼ終了しており、NISTでは「連邦組織は、電子署名、タイムスタンプ、衝突への耐性を必要とするアプリケーションでのSHA-1の利用を可及的速やかに中止すべきである。2010以降はSHA-2を利用すべきである」としている。
SHA-2はセキュリティ的にSHA-1より優れているものの、SHA-1ほど広くは用いられていない。その理由として、Microsoft Windows XPのSP2以前がSHA-2をサポートしていないことや、SHA-1において実際の衝突が発見されていなかったために緊迫感に欠けたことが挙げられる。ただし後者については、2017年に2月23日にGoogleとオランダの研究機関CWI Instituteが共同で2つの異なるファイルから同じSHA-1ハッシュ値を生成する衝突に成功した。
また、Windows XPのサポート終了などの背景から、公的機関でのSHA-1の使用を原則的に終了する動きがあり、民間のウェブサイトでもSHA-2へ移行するケースが出始めた（詳細はSHA-1#概要を参照）。

公的認証

FIPSに認定されたすべての関数の実装は、NISTとCommunications Security Establishment Canada (CSEC)によるCryptographic Module Validation Programの認定を申請することが可能である。2013年現在、SHA-256については1300以上、SHA-512については900以上の実装が認定されている。

ハッシュ値の例

空の入力に対するハッシュ値：
SHA224("")
0x d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42fSHA256("")
0x e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855SHA384("")
0x 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95bSHA512("")
0x cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3eSHA512/224("")
0x 6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4SHA512/256("")
0x c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a
入力メッセージのわずかな違いも、出力されるハッシュ値に大きな変化を及ぼす。例えば、メッセージの最後にピリオドを加えた場合：
SHA224("The quick brown fox jumps over the lazy dog")
0x 730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525SHA224("The quick brown fox jumps over the lazy dog.")
0x 619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c