SHA256 vs SHA1
SHA1とSHA256はどちらもSHA(Secure Hash Algorithm)ファミリーの暗号学的ハッシュ関数ですが、セキュリティと出力サイズにおいて大きな違いがあります。アプリケーションに誤ったハッシュ関数を選択すると、デジタル署名の弱体化からパスワード検証システムの完全な破綻に至るまで、深刻なセキュリティ上の結果を招く可能性があります。このガイドでは、十分な情報に基づいた決定を下せるよう、徹底的な比較を提供します。
暗号学的ハッシュ関数は、任意のサイズの入力を受け取り、固定サイズの出力(ダイジェストまたはハッシュ値と呼ばれます)を生成します。安全なハッシュ関数の重要な特性には、プリイメージ耐性(ハッシュ値から元の入力を求めることが不可能であること)、第二プリイメージ耐性(同じハッシュ値を持つ異なる入力を見つけることが不可能であること)、衝突耐性(同じハッシュ値を持つ2つの異なる入力を見つけることが不可能であること)があります。SHA1とSHA256はどちらもこれらの特性を提供するように設計されましたが、SHA1の衝突耐性は実際に突破されています。
ハッシュ関数の仕組み
SHA1とSHA256はどちらもMerkle-Damgård構造型のファミリーに属しています。入力データを512ビットの固定サイズブロックで処理します。入力はまず、その長さがブロックサイズの倍数になるようにパディングされます。パディングには元のメッセージ長が含まれており、特定のタイプの攻撃を防ぎます。各ブロックは、内部状態を更新する圧縮関数によって処理されます。すべてのブロックを処理した後の最終状態がハッシュ出力になります。
SHA1は32ビットワードを使用した80ラウンドの圧縮を行い、160ビットの出力を生成します。このアルゴリズムは4つのラウンド定数と20のラウンド関数を使用し、各ラウンドは5つの32ビット作業変数で動作します。SHA256は同じく32ビットワードを使用した64ラウンドの圧縮を行いますが、8つの作業変数と6つの論理関数を使用して256ビットの出力を生成します。作業変数の増加とより複雑なラウンド関数により、SHA256は解読攻撃に対して大幅に高い耐性を持ちます。
主な違い
| 特徴 | SHA1 | SHA256 |
|---|---|---|
| 出力サイズ | 160ビット(40文字) | 256ビット(64文字) |
| セキュリティ | 破られている(SHAttered攻撃) | 安全 |
| 速度 | 高速 | 低速 |
| ラウンド数 | 80 | 64 |
| ブロックサイズ | 512ビット | 512ビット |
| ワードサイズ | 32ビット | 32ビット |
| 推奨? | いいえ | はい |
最も重要な違いはセキュリティです。SHA1は、研究者が実用的な衝突攻撃を実証したため、暗号学的に破られたと見なされています。SHA256は2026年現在、128ビットのセキュリティレベルを下回る既知の実用的な攻撃はなく、安全なままです。nビットのセキュリティレベルとは、ハッシュ関数を破るのに最良の既知の攻撃で約2^n回の操作が必要であることを意味します。SHA256の場合、これは2^128回の操作を意味し、現在および予見可能な技術では実行不可能です。
出力サイズの違いも実用的に重要です。160ビットの出力は、2^160通りのハッシュ値しか存在しないことを意味します。誕生日のパラドックスにより、約2^80回の操作で衝突を見つけることができます。2^80はかつては実行不可能と考えられていましたが、GPUコンピューティングと専用ハードウェアの進歩により、資金力のある攻撃者にとってこの攻撃面は実用的なものになりました。SHA256の2^128の衝突耐性は、依然として手の届かない範囲です。
SHAファミリーの完全比較
SHAファミリーは30年にわたって進化し、各世代が先行世代の弱点を改善してきました。
| アルゴリズム | 出力 | セキュリティレベル | 年 | 状態 |
|---|---|---|---|---|
| SHA0 | 160ビット | 80ビット | 1993 | 破られている |
| SHA1 | 160ビット | 80ビット | 1995 | 非推奨 |
| SHA224 | 224ビット | 112ビット | 2004 | 安全 |
| SHA256 | 256ビット | 128ビット | 2004 | 安全 |
| SHA384 | 384ビット | 192ビット | 2004 | 安全 |
| SHA512 | 512ビット | 256ビット | 2004 | 安全 |
| SHA3-256 | 256ビット | 128ビット | 2015 | 安全 |
SHA0は公開後まもなく、未公開の欠陥により撤回されました。SHA1はSHA0の修正として設計され、約20年間業界標準として機能しました。SHA224、SHA256、SHA384、SHA512は総称してSHA-2として知られ、NISTによって2001年に公開されました(2004年に標準化)。2015年に公開されたSHA-3はKeccakスポンジ構築に基づいており、根本的に異なる設計原理を持つSHA-2の代替手段を提供します。
ハッシュ関数を選択する際は、ほとんどのアプリケーションでSHA256をデフォルトとして使用すべきです。SHA384とSHA512はより高いセキュリティレベルを提供しますが、出力が大きくパフォーマンスが低下するというコストがかかります。SHA3-256は、SHA-2ファミリーから暗号依存関係を多様化したい場合に優れた選択肢です。
SHA1が引退した理由
SHA1の引退は一夜にして起こったわけではありません。暗号解読者たちは2005年からSHA1の弱点について警告していました。その年、研究者は理論上の衝突耐性が期待される2^80ではなく、わずか2^69回の操作であることを実証しました。その後10年間にわたり、暗号解読技術の向上に伴い、これらの推定値は徐々に引き下げられていきました。
2017年、Googleは最初の実用的なSHA1衝突攻撃(SHAttered)を実証しました。彼らは約9,223,372,036,854,775,808回のSHA1計算を使用して、同じSHA1ハッシュを持つ2つの異なるPDFファイルを作成しました。これには約6,500年のCPU時間が必要でしたが、GPU時間ではわずか110年でした。この攻撃はGoogleのクラウドインフラを使用して実行され、計算時間に約110,000ドルのコストがかかり、SHA1の衝突が資金力のある組織にとって現実的な範囲内にあることを示しました。
SHAttered攻撃は特に、大量の同一ブロックを許容しながらも、同じSHA1ハッシュを生成する少数のビットが異なるPDF構造を注意深く構築することで、2つの衝突するPDFファイルを生成します。この攻撃の実用的な影響には、異なる内容を持つが同一のSHA1ハッシュを持つ2つのソフトウェアパッケージやドキュメントを作成できる可能性が含まれます。一方に対する署名が、他方にも適用されると不正に主張される可能性があります。
主要なブラウザと認証局は以来、SHA1を非推奨にしています。2017年現在、ChromeはSHA1証明書に対してセキュリティ警告を表示します。2020年までに、すべての主要ブラウザがSHA1ベースの証明書への信頼を削除し、Web PKIエコシステムにおけるSHA1の使用は実質的に終了しました。
パフォーマンス比較
SHA1はいくつかの理由でSHA256よりも高速です。第一に、SHA1はブロックあたり80ラウンドで入力を処理しますが、各ラウンドはSHA256の64ラウンドよりも単純です。SHA256はより複雑な論理関数とより大きな内部状態を使用するため、ラウンドあたりの計算量が多くなります。第二に、SHA1の160ビットの内部状態はSHA256の256ビットの状態よりも少ないレジスタに収まり、32ビットプロセッサでのより効率的な実装が可能です。
実際には、SHA256はソフトウェア実装においてSHA1よりも約25〜40パーセント低速です。ハードウェアアクセラレーション(x86プロセッサのSHA拡張機能)を備えた最新のハードウェアでは、SHA256のパフォーマンスは大幅に向上します。SHA-NI拡張機能を備えたIntelおよびAMDプロセッサは、SHA256を2 GB/sを超える速度で計算でき、SHA1との差を縮めています。
ほとんどのアプリケーションでは、SHA1とSHA256のパフォーマンスの差は無視できます。ファイルのハッシュ化や署名の検証における人間が知覚できる遅延は、ハッシュ計算ではなくI/O操作によって支配されます。SHA1の速度上の利点が重要となる唯一のシナリオは、ブロックチェーンマイニングや大規模なパスワードクラッキングなど、何十億ものハッシュを計算する高スループットシステムですが、新しい設計においてSHA1を使用する正当なユースケースはありません。
SHA256を使用すべき場合
| ユースケース | 推奨ハッシュ |
|---|---|
| SSL/TLS証明書 | SHA256 |
| ファイル整合性検証 | SHA256またはSHA512 |
| パスワードハッシュ化(ソルト付き) | bcryptまたはargon2 |
| デジタル署名 | SHA256 |
| ブロックチェーン | SHA256(Bitcoin) |
| コード署名 | SHA256 |
SSL/TLS証明書については、主要ブラウザが2017年にSHA1を非推奨にして以来、SHA256が最低要件となっています。認証局は公開信頼のためにSHA1署名証明書を発行することがもはや許可されていません。ソフトウェアダウンロードとともに配布されるチェックサムファイルなどのファイル整合性検証は、SHA256を使用すべきです。多くのソフトウェア配信プラットフォームはSHA1からSHA256チェックサムに移行していますが、レガシーパッケージではSHA1チェックサムに遭遇する可能性があります。
パスワードハッシュ化には特別な注意が必要です。SHA256は安全な暗号学的ハッシュ関数ですが、単独ではパスワードの保存に適していません。SHA256は高速になるように設計されており、これは攻撃者が盗まれたパスワードハッシュを解読しようとする際にまさに望む特性です。パスワードの保存には、bcrypt、scrypt、argon2などの専用のパスワードハッシュ化関数を使用してください。これらの関数はソルティングを組み込み、意図的に低速でメモリハードになるように設計されており、ブルートフォース攻撃に耐性があります。
実際の移行例
広く使用されているバージョン管理システムであるGitは、SHA256ベースのオブジェクトストレージへの移行の一環として、SHA1からSHA256に移行しました。Git 2.29以降、Gitは従来のSHA1リポジトリとともにSHA256リポジトリをサポートしています。この移行には大きな労力が必要でした。なぜなら、Gitのデータモデルはオブジェクトの識別とリポジトリの整合性検証にハッシュ値に大きく依存しているからです。
Linuxカーネルコミュニティは2011年からカーネルリリースtarballのSHA256チェックサムを受け入れ始め、既存のSHA1チェックサムを補完しました。2017年までに、kernel.orgは新しいリリースのSHA1チェックサムの生成を完全に停止し、SHA256とSHA512のみを使用するようになりました。
SHA256ジェネレーターツールを使用して、オンラインでSHA256ハッシュを生成できます。