SHA-512とは何か?SHA-2系ハッシュの仕様・安全性・実務活用ガイド

SHA-512とは — 概要

SHA-512は、SHA-2(Secure Hash Algorithm 2)ファミリーに属する暗号学的ハッシュ関数の一つで、出力長512ビット(64バイト)のハッシュ値を生成します。SHA-2は米国国家安全保障局(NSA)によって設計され、NIST(米国国立標準技術研究所)の標準(FIPS 180)として採用されています。SHA-512は、データの整合性検査、デジタル署名、HMACなど、幅広い暗号プロトコルやアプリケーションで用いられています。

基本仕様(主なパラメータ)

  • 出力長(digest): 512ビット(64バイト)
  • 内部語長(word size): 64ビット
  • ブロック長: 1024ビット(128バイト)
  • ラウンド数: 80ラウンド
  • パディング: 「1ビット追加+0で埋め、最後にメッセージ長(128ビット)を付加」方式(ビッグエンディアン)
  • 設計手法: Merkle–Damgård構造に基づく圧縮関数(Davies–Meyer 型の圧縮関数)

アルゴリズムの流れ(高レベル)

SHA-512の処理手順は次のようになります。

  • メッセージにパディングを施し、長さを1024ビットの倍数にする(1ビット追加、0埋め、最後に128ビットで元のメッセージ長を記録)。
  • メッセージを1024ビット(128バイト)ブロックに分割する。
  • 各ブロックについてメッセージスケジュール(80個の64ビット語)を生成する。前半の16語はブロックから直接取得し、残りはσ関数(小文字のシグマ)を用いて展開する。
  • 初期ハッシュ値(8つの64ビットワード)を設定する。これらは素数の平方根の小数部分に基づく固定値で、標準で定義される。
  • 圧縮関数を80ラウンド適用する。各ラウンドで大文字のΣ、小文字のσ、Ch(選択)やMaj(多数決)などのビット演算(ビット回転・右シフト・XOR・AND・NOT)を組み合わせる。
  • 最終的に8つの64ビットワードを連結して512ビットのハッシュ値を得る。

内部構造の詳細

SHA-512は64ビット単位の操作を基本とします。主な演算は以下のとおりです。

  • 右回転(ROTR)と右シフト(SHR)
  • 大文字のシグマ(Σ0, Σ1)はラウンド内で用いる高次関数で複数のROTRを組み合わせる
  • 小文字のシグマ(σ0, σ1)はメッセージスケジュール展開時に使用される関数
  • 選択関数 Ch(x,y,z) = (x AND y) XOR (NOT x AND z)
  • 多数決関数 Maj(x,y,z) = (x AND y) XOR (x AND z) XOR (y AND z)

また、80個の定数K[t](t=0..79)が使用されます。これらは最初の80個の素数の立方根の小数部分を64ビットで切り出したもの、初期ハッシュ値は最初の8個の素数の平方根の小数部分から導出されます。こうした定数や初期値はアルゴリズムの設計における「固定された乱数源」として機能します。

安全性と強度

SHA-512の出力が512ビットであることから、理論的な耐性は次のように見積もられます(古典計算機モデル):

  • 衝突耐性(collision resistance): 約 2^256 の計算コスト(誕生日攻撃による)。
  • 原像耐性(preimage resistance): 約 2^512 の計算コスト。
  • 第二原像耐性(second-preimage resistance): 原像耐性に準ずる強度。

実際のところ、2000年代以降にSHA-1で衝突が実証された経緯はありますが、SHA-2(SHA-256/384/512)については現在までに実用的な衝突や原像を発見する攻撃は報告されていません。したがって、現時点では実用上安全と見なされています。ただし、暗号の将来の進展(新たな攻撃手法や量子計算機の発展)によって安全性評価は変わり得ます。

量子コンピュータの影響

量子アルゴリズムはハッシュ関数の安全性に影響を与えます。代表的なものにGroverのアルゴリズムがあり、これは原像攻撃のコストを平方根に短縮します。つまり、SHA-512の古典的原像強度が2^512であれば、量子探索によって約2^256となる可能性があります。一方、衝突探索に関しては量子アルゴリズム(Brassard–Høyer–Tapp など)により理論上はさらに効率化され、理論的な衝突コストはおおよそ2^(n/3)程度に下がるとされる研究もあります(nは出力長)。このため、将来を見据える場合は十分な出力長を持つハッシュ関数や量子耐性の設計を考慮する必要があります。

既知の攻撃と実装上の注意点

  • 既知の暗号学的破綻: SHA-512自体の実用的な破綻(衝突や原像の発見)は報告されていません。
  • 長さ拡張攻撃(Length Extension): Merkle–Damgård構造のため、単純にハッシュ値とメッセージ長だけが分かる場合にハッシュの延長が可能です。HMAC のような構造(キーと一緒にハッシュ化する)を使えば、この攻撃は防げます。
  • 実装上の注意: サイドチャネル(タイミング、電力消費など)解析や、定数時間実装が必要な場面があります。また、パディングやエンディアンの誤り、長さフィールドの扱いミスは致命的なバグの原因になります。
  • パスワード保護: パスワード保存に直接SHA-512を使うのは推奨されません。専門の鍵導出関数(PBKDF2、bcrypt、scrypt、Argon2など)を使い、ストレッチング/ソルトを適切に行うべきです。

派生・変種

SHA-512にはいくつかの派生バージョンが存在します。たとえばSHA-384は初期値を変え、出力を384ビットに切り詰めたものです。他にもSHA-512/224やSHA-512/256といった出力長を短くした変種が規格で定義されています。これらは同じ内部構造(64ビット語、1024ビットブロック、80ラウンド)を用いつつ、初期値や最終出力の切り取り方を変えたものです。

利用例と実務上の使いどころ

  • デジタル署名(RSA, ECDSA など)のハッシュアルゴリズムとしての使用(例: SHA-512withRSA)。
  • TLS/SSLや証明書でのハッシュアルゴリズムの一つ(設定によりSHA-512系を選択可能)。
  • HMAC-SHA512を用いたメッセージ認証(HMAC は長さ拡張攻撃への対策になる)。
  • ファイルの整合性チェックやソフトウェア配布の署名検証。
  • ただし、パスワード保護用途では専用のKDFやスローハッシュを使用するのが安全。

パフォーマンス面の特徴

SHA-512は内部で64ビット演算を行うため、64ビットCPU上では最適化の恩恵を受けやすく、同じクラスのSHA-256より高速な実装を出せることが多いです。一方で、32ビットプラットフォームでは64ビット演算をエミュレートする必要があり、オーバーヘッドが大きくなります。そのため用途に応じてSHA-256やSHA-512のどちらを選ぶかを検討します。

実装例(参考)

ほとんどの暗号ライブラリ(OpenSSL、libsodium、Crypto++、BouncyCastleなど)でSHA-512は実装済みです。コマンドラインでは多くのUNIX系環境で sha512sum が利用できます(例: echo -n "hello" | sha512sum)。ただし、パディング・エンディアンなどの仕様違いに注意して、既存の信頼できるライブラリを利用することが推奨されます。

まとめ(要点)

SHA-512は512ビットの出力を持つSHA-2ファミリーの堅牢なハッシュ関数であり、現在において実用的な攻撃は報告されていません。デジタル署名、HMAC、データ整合性など多くの場面で利用されますが、パスワード保存のような用途では専用のスローハッシュやKDFを用いること、長さ拡張攻撃を考慮してHMACなどの安全な構造を使うこと、そして量子計算機の将来的影響を踏まえた長期的な選択を検討することが重要です。

参考文献