Prompt
SHA-1ぐらいなら、コリジョンはあり得ないんじゃないの?
あはは!その「コリジョン(衝突)なんて、天文学的な確率でしょ?」という感覚、実は2017年までは正しかったんだ。
でも、情報工学の歴史において、2017年2月23日は「SHA-1の安全性が物理的に崩壊した日」として刻まれているよ。Googleとオランダの研究機関(CWI)が、**「SHAttered」**というプロジェクトで、世界で初めてSHA-1の衝突を実証したんだ。
「あり得ない」はずの衝突がなぜ起きたのか、そしてGitにとってそれが何を意味するのか、解剖してみよう!
1. 「SHAttered」:2つのPDF、同じハッシュ値
Googleの研究チームは、**「中身(視覚的な内容)は全く違うのに、SHA-1ハッシュ値が完全に一致する」**2つのPDFファイルを作成することに成功したんだ。
-
計算量: 当時の最新GPUをフル稼働させても、1つの衝突を見つけるのに「922京回」の計算が必要だった。
-
物理的な規模: 単一のCPUで計算すると 6,500年、単一のGPUでも 110年 かかる計算量。
-
結論: 「偶然」起きることはまずないけれど、「莫大な計算資源を持つ組織(国家レベルなど)が、意図的に狙えば」 衝突は作れることが証明されてしまったんだね。
2. Gitの宇宙で衝突が起きるとどうなる?
Gitは「中身のハッシュ値」をインデックス(索引)に使っているから、もし衝突が起きるとシステムが**「論理的なパニック」**を起こすよ。
-
データの「上書き」:
file_Aをコミットした後、それと衝突するfile_Bを追加しようとすると、Gitは「ハッシュが同じだから、もう持ってるデータだね」と判断する。 -
データの「喪失」: 結果として、
file_Bの中身は無視され、レポジトリ内ではfile_Aの中身だけが生き残る。 -
チェックアウトの破壊:
file_Bを取り出そう(checkout)としても、出てくるのはfile_Aの中身。これでレポジトリの整合性は完全に崩壊する。
これが君の言った「宇宙が壊れる」状態だね。
3. なぜGitは今もSHA-1を使っているのか?
「危ないなら今すぐ変えればいいのに」と思うよね。でも、Gitのような巨大なインフラでハッシュ関数を変えるのは、さっきの「PythonのGIL撤廃」並みに大変なことなんだ。
-
後方互換性: 世界中の数億のレポジトリがSHA-1で歴史を刻んでいる。これを突然SHA-256に変えると、古いコミットとの整合性が取れなくなる。
-
多層防御: Gitの最新バージョンでは、ハッシュ計算の際に関数を少し工夫して、「SHAttered」のような特定の攻撃手法を検知・回避する仕組みが導入されているよ。
-
移行への道: 実はGitには既に SHA-256 への移行計画があり、新しいレポジトリならSHA-256を使えるようになっているんだ。でも、業界全体が完全に移行するには、まだ数年はかかるだろうね。
⚠️ 見落とされがちな落とし穴:バースデー・パラドックス
「衝突が起きる確率」を考えるとき、僕たちはつい「全パターン()」との比較で考えてしまうけれど、実際には 「バースデー・パラドックス」 という統計の罠がある。
「2つの特定のデータが同じになる確率」より、**「膨大なデータ群の中に、どれか2つ同じペアが存在する確率」**の方が、圧倒的に高く(早く)現れるんだ。これが、ハッシュ関数の寿命を縮める最大の原因だよ。
結論
SHA-1の衝突は、**「自然界では起きないが、悪意ある天才がスーパーコンピュータを使えば作れる」**というフェーズに入っている。
君が個人のプロジェクト(Garden)でGitを使う分には全く心配いらないけれど、国家機密や超大規模な金融システムを扱うなら、「ハッシュ関数の世代交代」は避けて通れない課題なんだね。
次は、実際に 「ハッシュ値が衝突するようなデータを生成するツール(実験用)」 の話をしてみる?それとも、「SHA-256になると、計算速度やデータ量にどんな影響が出るのか」 について深掘りしてみるかな! Would you like me to …?