日本語

開発者ツール · SHA ハッシュ計算ツール

SHA-256 と SHA-512: ワード サイズ、丸め、および 512 の方が高速である理由

· 仕組み

しゃ-256 暗号化 パフォーマンス ブラウザ API

32 ビットと 64 ビットのワード、64 対 80 のラウンド、256、384、512 の出力ビットの並列比較
オリジナル ToolAcre ベクトル イラスト

SHA-512 はより長いダイジェストを生成しますが、多くの場合、64 ビットのハードウェアでより高速に実行されます。この投稿では、事実に基づいて選択できるように、2 つの構造的な違いと SHA-384 がどのように適合するかを説明します。

ハッシュが長いほど実行が速くなりますか? — 比較の始まりとなる直感に反する観察

SHA-512 は長いダイジェストを生成しますが、多くの場合、64 ビット ハードウェアでは SHA-256 よりも高速に実行されます。直観に反する観察は CPU の設計から来ています。64 ビットの算術演算用に最適化されたプロセッサは、同じデータに対して 64 ビットの演算を 32 ビットの演算よりも速く実行します。 SHA-256 は 32 ビット ワードで動作し、SHA-512 は 64 ビット ワードで動作します。 64 ビット CPU では、後者の方がハードウェアにより自然に適合し、ワード サイズの変換とパディングに費やす時間が短縮されます。

これにより、SHA-512 が本質的にあらゆるユースケースに適したものになるわけではありません。ダイジェストが長くなると、より多くのストレージと帯域幅が必要になります。どちらを選択するかは、「新しい」または「強力」という漠然とした感覚ではなく、出力サイズの要件とプラットフォームに基づいて選択する必要があります。

32 ビット ワードと 64 ビット ワード — 核となる構造の違いと、それが最新の CPU に適している理由

SHA-256 は、アルゴリズム全体を通じて 32 ビット ワードで動作します。メッセージ スケジュールは、16 32 ビット ワードを 64 32 ビット ワードに拡張します。各ラウンドで 8 つの 32 ビット作業変数が更新されます。メッセージ ブロックは 512 ビット (16 の 32 ビット ワード) です。出力は 256 ビット (8 つの 32 ビット ワード) です。すべての算術演算は 32 ビット値で行われ、2^32 でオーバーフローがラップされます。

SHA-512 は 64 ビット ワードで動作します。メッセージ スケジュールは、16 64 ビット ワードを 80 64 ビット ワード (SHA-256 のような 64 ではありません) に拡張します。各ラウンドで 8 つの 64 ビット作業変数が更新されます。メッセージ ブロックは 1024 ビット (16 の 64 ビット ワード) です。出力は 512 ビット (8 つの 64 ビット ワード) です。すべての算術演算は 64 ビット値で実行され、2^64 でオーバーフローがラップされます。

64 丸めと 80、512 ビット ブロックと 1024 ビット ブロックの比較 - ブロックごとおよびバイトごとに何が変わるか

SHA-256 はブロックごとに 64 ラウンドを実行します。 SHA-512 は、ブロックごとに 80 ラウンドを実行します。これは、SHA-512 がブロックごとにより多くのミキシングを行うことを意味します。一見すると、これは遅く感じられます。ただし、ワード サイズとブロック サイズが大きくなると、SHA-512 はラウンドあたりにより多くのビットを処理することになります。 1 メガバイトのファイルの場合、SHA-256 は、それぞれ 64 ラウンドを含む 1048576 / 512 = 2048 ブロックを処理し、合計 131072 ラウンドになります。 SHA-512 は、それぞれ 80 ラウンドを含む 1048576 / 1024 = 1024 ブロックを処理し、合計 81920 ラウンドを処理します。 SHA-512 は、ブロックごとに実行するラウンド数は多くなりますが、合計で実行するラウンド数は少なくなります。

実測時間の違いは、CPU のワード サイズの最適化によって異なります。 64 ビット ALU (算術論理演算ユニット) を備えた CPU は、64 ビットの演算を効率的に実行します。同じ CPU が 32 ビット SHA-256 オペレーションを複数のマイクロオペレーションに分割するか、より小さな実行ユニットで実行する必要がある場合、オペレーションあたりのコストは高くなります。最新のプロセッサは 64 ビット操作に最​​適化されており、多くの場合、ブロックごとの追加ラウンドにもかかわらず SHA-512 が高速になります。

ブロック サイズとラウンド カウントは、バイトあたりの作業量を説明します。実際のスループットにはプラットフォームのベンチマークが必要です

ブロック演算は、出力が長くてもバイトあたりの作業量が増える必要がない理由を説明しています。 SHA-256 は 512 ビット ブロックごとに 64 ラウンドを実行し、SHA-512 は 1,024 ビット ブロックごとに 80 ラウンドを実行します。 2 番目の設計では、各ブロックでより多くのラウンドを実行しますが、1 つを処理するたびに 2 倍の入力を消費します。

この構造比較は、特定のブラウザーのベンチマークを予測するものではありません。 Web Crypto では、ネイティブ命令、オペレーティング システム ライブラリ、またはその他の最適化されたコードが使用される場合があり、入力の長さによってセットアップに費やされる割合が変わります。スループットが重要な場合は、実際のターゲット環境を測定します。リポジトリは、より広い単語が 64 ビットのハードウェアに適しているという定性的な主張のみをサポートしています。

出力の長さは、出典のない攻撃作業の見積もりなしで表現とセキュリティのプロパティに影響します

SHA-384 は別個のアルゴリズムではありません。これは SHA-512 ですが、2 つの変更が加えられています。初期ハッシュ定数が異なり、出力は完全な 512 ビットではなく 384 ビット (48 バイト) に切り詰められています。この切り捨てには、長さ拡張攻撃に対して利点があります。つまり、完全な 512 ビットの状態が不明であるため (開示されたのはその中の 384 ビットだけ)、攻撃者は元のメッセージにデータを追加してダイジェストを拡張できません。

SHA-256 は、長さ拡張攻撃に対して脆弱です。メッセージのダイジェストとメッセージ長がわかっていれば、元のメッセージの内容を知らなくても、メッセージにデータを追加して拡張メッセージのダイジェストを計算できます。これは、弱い構造を使用する HMAC 実装など、特定のセキュリティ コンテキストにおいて重要です。 SHA-384 は、SHA-512 に基づいているにもかかわらず、完全な状態が公開されていないため、脆弱ではありません。これにより、SHA-256 が危険であると考えられる状況で SHA-384 が役立ちます。

実用的な例 — 1 つの入力を 3 つすべてでハッシュし、ダイジェストの長さを並べて比較する

出力サイズは最も簡単な違いです。 SHA-256 は 32 バイト (64 16 進文字) を生成します。 SHA-384 は 48 バイト (96 16 進文字) を生成します。 SHA-512 は 64 バイト (128 16 進文字) を生成します。 URL または JSON に保存する場合、ダイジェストが長いほど多くのスペースが必要になります。衝突耐性の場合、出力が長くなると、衝突の発見が飛躍的に困難になります。幅広い出力により、より大きな結果スペースが提供されますが、ストレージ、URL、およびプロトコル フィールドのバイト数が増加するなど、その結果の直接的な結果は測定が容易になります。リポジトリの証拠から得られたものはないため、この記事には攻撃作業の見積もりは添付されていません。

一部のシステムおよび標準では、SHA-256 を明示的に指定しています。他のものは SHA-512 を使用するか、選択を許可します。 SSH フィンガープリントのデフォルトは SHA-256 です。コンテナー イメージ ダイジェストは SHA-256 または SHA-512 です。 npm などのパッケージ マネージャーは、サブリソースの整合性のために SHA-512 を使用します。多くの場合、選択はあなたに委ねられますが、違いを理解することで、自分に発言権があるときに賢明に選択できるようになります。

これでカバーされないもの — CPU、コンパイラ、入力サイズに依存するスループットの数値。投稿は定性的なものにとどまる

ToolAcre SHA ハッシュ計算ツールは、SHA-256、SHA-384、および SHA-512 を提供します。 3 つすべてで同じ入力をハッシュし、出力の長さを観察します。ダイジェストはすべて互いに完全に異なりますが、これは予想通りです。アルゴリズムは異なるラウンド定数、異なるメッセージ スケジュール、および異なる混合操作を使用します。ダイジェストの横に表示されるバイト数は、出力サイズではなく入力サイズのみを反映します。 3 つのアルゴリズムはすべて、同じ入力バイトをそれぞれのラウンド シーケンスまで同様に処理します。

独自のハードウェアでテストすると、パフォーマンスの違いが明らかになります。各アルゴリズムで大きなファイル (数メガバイトのテスト ケース) をハッシュし、結果の時間を計測します。最新の 64 ビット システムでは、バイト数がそうでないことを示唆している場合でも、SHA-512 は多くの場合、より短い実時間で完了します。 32 ビット システムまたは組み込みプロセッサでは、CPU の ALU が 32 ビット演算用に最適化されているため、SHA-256 の方が高速になる可能性があります。

要点: 出力サイズとプラットフォームによって選択します。ToolAcre SHA ハッシュ計算ツールは SHA-256、SHA-384、SHA-512 を提供するため、同じ入力で 3 つすべてを確認できます。

暗号強度はパフォーマンスとは別のものです。リポジトリは SHA-256 を破損としてマークせず、それを汎用のデフォルトとして選択します。その製品の証拠は、あらゆる原始的なものを普遍的に安全であると呼ぶことを正当化するものではありません。適合性は依然として構造と脅威モデルに依存します。 SHA-256 から SHA-512 への切り替えはセキュリティのアップグレードではありません。これはストレージとパフォーマンスのトレードオフです。システムで SHA-256 が指定されており、その正確なアルゴリズムが必要な場合は、それを使用してください。選択肢があり、より長いダイジェストが必要な場合、またはプラットフォームが 64 ビットであることがわかっている場合は、SHA-512 が有効な選択です。

ブラウザの Web Crypto 実装は、crypto.subtle.digest を介して 3 つすべてを計算します。デバイス、ブラウザのバージョン、バックグラウンドのシステム負荷はすべて、観察されるパフォーマンスに影響します。しかし重要な点は変わりません。SHA-256 と SHA-512 は「最高のハッシュ関数」の称号をめぐって競合しているわけではありません。これらはさまざまな出力要件に合わせて設計されたツールであり、一般的なパフォーマンス要求ではなく、システムのニーズに基づいて選択されます。