チェックサムとは?データ整合性の検証を解説
チェックサムはデータブロックから計算される短い値で、データが破損したり改変されたりしていないことを検証できます。
チェックサムはデータのフィンガープリントです。ファイルから計算し、後で再計算した人は誰でもそのファイルがバイト単位で同一であることを確認できます。チェックサムは CI における整合性の屋台骨です。ダウンロードを検証し、キャッシュを検証し、artifact が転送中に改ざんまたは破損したときにそれを検出します。
チェックサムとは何か
チェックサムは、定義されたアルゴリズムによって入力データから導出される固定サイズの値です。入力のわずか 1 バイトを変えてもチェックサムは変わります。新たに計算したチェックサムを既知の正しいものと比較することで、データを直接調べることなく無傷であることを検証できます。
整合性とセキュリティ
単純なチェックサム(CRC32 など)は偶発的な破損を捉えますが偽造が容易なため、攻撃者ではなく伝送エラーから保護します。SHA-256 のような暗号学的ハッシュは、攻撃者が同じチェックサムを持つ異なるデータを作れないように設計されており、これがセキュリティに必要なものです。
チェックサムの使われ方
公開者はリリースのチェックサムを計算し、ファイルと並べて掲載します。ダウンロード後、チェックサムを再計算して比較します。一致すれば、ファイルは無傷かつ改変されずに届いたことになります。パッケージマネージャや lockfile は、インストールするすべての依存関係についてこれを自動化します。
CI におけるチェックサム
CI はいたるところでチェックサムに依存します。ツールを実行する前にダウンロードしたものを検証し、依存関係が変わったときにキャッシュが無効になるよう lockfile のハッシュからキャッシュキーを導出し、ビルドされた artifact が公開されたものと一致することを確認します。不一致はビルドを明確に失敗させるべきです。
# Cache key from a lockfile checksum in GitHub Actions
steps:
- uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}Latchkey に関する注記
Latchkey のキャッシュはコンテンツハッシュを使ってキャッシュエントリをキーイングおよび検証するため、キャッシュの復元は保存されたバイトが期待されるチェックサムと一致した場合にのみ成功します。同じ整合性の原則を、ウォームなビルドを正しく保つために適用したものです。
重要なポイント
- チェックサムはデータから計算されるフィンガープリントで、そのデータへのあらゆる変更を明らかにします。
- 単純なチェックサムは偶発的な破損を捉え、暗号学的ハッシュは意図的な改ざんに耐えます。
- CI はチェックサムを使ってダウンロードを検証し、lockfile からキャッシュをキーイングし、artifact の整合性を確認します。