はじめに
以前、Git 3.0で予定されている変更点についてまとめました。
今回はその中でも最も大きな変更の一つである「SHA-256への移行」について深掘りしていきます。
一見するとSHA-1がSHA-256になるだけでしょ?と思いがちですが、実はGitの内部構造そのものに関わる大きな変更です。
SHA-1はどこで使われている?
まずはGitでSHA-1が使われている場所を見てみます。
Gitでは
- Blob
- Tree
- Commit
- Tag
といったオブジェクトすべてがSHA-1で識別されています。
つまり、下記のすべてにSHA-1が利用されています。
README.md
↓
Blob
↓
Tree
↓
Commit
皆さんが普段見ているコミットIDもSHA-1です。
a1b2c3d...
なぜSHA-256へ変更するのか
SHA-1は長年利用されてきましたが、2017年には「SHAttered」と呼ばれる衝突攻撃が実証されました。
Gitでは独自の対策が入っていますが、将来的な安全性を考慮しSHA-256へ移行する方針となっています。
SHA-256になると何が変わる?
一番大きいのは、GitオブジェクトのIDが変わるという点です。
例えば40文字(SHA-1)だったものが64文字(SHA-256)になります。
つまり、
- Commit ID
- Tree
- Tag
- Blob
すべての識別子がSHA-256になります。
SSHやHTTPSは変わる?
ここは勘違いしやすいポイントです。
今回変更されるのはGitオブジェクトのハッシュです。
つまりSSH鍵やHTTPS認証、Personal Access Tokenなどの認証方式とは関係ありません。
普段利用している下記の認証方法が変わるわけではありません。
git clone
git pull
git push
今日試すことはできる?
実はできます。
git init --object-format=sha256
これだけでSHA-256形式のリポジトリを作成できます。
ただしGit公式もエコシステム全体の対応が前提であることを説明しており、既存リポジトリを急いで移行する段階ではありません。
業務への影響
現時点で多くの開発者が「明日から何か対応する」必要はありません。
しかしGitHubやCI/CD、Gitライブラリなど周辺ツールも含めた対応が今後進んでいくことになります。
Git 3.0は内部実装の変更が多いですが、このSHA-256への移行は最もインパクトの大きい変更の一つと言えるでしょう。
まとめ
Git 3.0では、SHA-256への移行が予定されています。
一見するとハッシュアルゴリズムが変わるだけに思えますが、GitではCommitやTreeなど、ほぼすべてのオブジェクト識別に利用されているため影響範囲は非常に広くなります。
普段のGit操作が大きく変わるわけではありませんが、Gitの内部で何が起きているのかを知る良い機会になると思います。
さいごに
前回の記事をたくさんの方に見ていただいているようで、とても驚きました!
今後も需要があるようでしたら、もう少し深掘りしたものをあげようと思います!