ソフトウェアやISOイメージをダウンロードした後、そのファイルが正規のものかどうかを確かめたい場面があります。ハッシュ値(チェックサム)を使った整合性確認は、改ざんや転送中の破損を検出する基本的な手段で、追加パッケージなしにLinux上ですぐに行えます。
なぜハッシュ値で検証するのか
ファイルをインターネット経由でダウンロードするとき、通信の途中でデータが壊れたり、配布サーバーが侵害されてマルウェアが埋め込まれたりするリスクがあります。有名なオープンソースプロジェクトのミラーサイトが改ざんされ、偽のバイナリが配布されるインシデントは一般的に知られており、珍しい話ではありません。
ハッシュ関数は、任意の長さのデータを受け取り、固定長の文字列(ハッシュ値)を出力します。SHA-256 の場合は256ビット(64文字の16進数)です。ファイルの中身が1バイトでも変わると出力が大幅に変化するため、公式が公開したハッシュ値と自分で計算した値が一致していれば、ファイルが正規のものである可能性が高いと判断できます。
なお、ハッシュ値の一致はあくまで「ファイルが配布元の想定どおりである」ことを示すものです。チェックサム自体が正規のものかどうかは別の問題であり、より高いセキュリティが求められる場面ではGPG署名の検証も合わせて行う必要があります。
使用するコマンドの選び方
Linux では GNU coreutils に含まれる以下のコマンドが標準で利用できます。
md5sum― MD5アルゴリズム。現在は衝突が発生しやすいと知られており、改ざん検出目的では推奨されません。ただし、古いソフトウェア配布ではこれしか提供されていない場合があります。sha256sum― SHA-256アルゴリズム。現在の配布ファイル検証で最も広く使われており、まずこれを選びます。sha512sum― SHA-512アルゴリズム。よりハッシュ値が長く、一部のディストリビューションやセキュリティ重視のプロジェクトで採用されています。
どのアルゴリズムを使うかは、配布サイトが公開しているチェックサムの種類に合わせます。SHA-256 と SHA-512 の両方が提供されているときは、SHA-256 で十分です。コマンドが使える状態かどうかは which sha256sum で確認できます。
ハッシュ値を計算して照合する
ここでは example.iso というファイルを例に、SHA-256 での検証手順を示します。
まず、次のコマンドでハッシュ値を計算します。
sha256sum example.iso
出力は「ハッシュ値(スペース2つ)ファイル名」の形式になります。
3b4c2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2 example.iso
この出力を、公式サイトに掲載されているハッシュ値と照合します。先頭や末尾の数文字だけを目視確認するのは不十分で、64文字すべてが一致していることを確かめてください。
目視ミスを防ぎたい場合は、シェルで比較する方法が使えます。EXPECTED の値には公式サイトに掲載されているハッシュ値を入れます。
EXPECTED="3b4c2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2"
ACTUAL=$(sha256sum example.iso | awk '{print $1}')
if [ "$EXPECTED" = "$ACTUAL" ]; then
echo "OK: ハッシュ値が一致しました"
else
echo "NG: ハッシュ値が一致しません"
fi
チェックサムファイルを使って一括確認する
複数ファイルを配布しているプロジェクトでは、ハッシュ値をまとめた SHA256SUMS や checksums.txt などのファイルが提供されることがあります。このファイルをダウンロードしたファイルと同じディレクトリに置き、次のコマンドを実行すると、記載されたすべてのファイルをまとめて検証できます。
sha256sum -c SHA256SUMS
各ファイルについて example.iso: OK と表示されれば整合性が取れています。FAILED と表示されたファイルは再ダウンロードしてください。
ファイル数が多く OK の行が邪魔な場合は --quiet オプションを付けると、問題のあるファイルだけを出力できます。
sha256sum -c --quiet SHA256SUMS
チェックサムファイルに記載されたファイルのうち、存在しないものがある場合は WARNING: X listed file could not be read と表示されます。対象ファイルがダウンロード済みかどうかもあわせて確認してください。
よくあるつまずきと対処法
ハッシュ値が一致しない
まず疑うべきは転送の失敗による不完全なダウンロードです。次のコマンドでファイルサイズを確認し、公式サイトに記載されているサイズと一致しているかどうかを確かめてみてください。
ls -lh example.iso
サイズが一致していてもハッシュが合わない場合は、ミラーサイト経由ではなく公式サイト直接のURLからダウンロードし直す方法が有効です。ミラーサイトの更新タイミングがずれているケースも一般的に見られます。
「no properly formatted」エラーが出る
チェックサムファイルをWindowsで作成・編集した場合、行末コードが CRLF になっていることがあります。このとき sha256sum -c がフォーマットエラーを返します。次のコマンドで改行コードを変換してから再実行してください。
sed -i 's/\r//' SHA256SUMS
sha256sum -c SHA256SUMS
「そのようなファイルやディレクトリはありません」と出る
sha256sum -c はチェックサムファイルに記載されたパスを相対パスとして解釈します。チェックサムファイルと検証対象のファイルを同じディレクトリに置いてから実行してください。サブディレクトリが含まれている場合は、チェックサムファイルが生成されたときのディレクトリ構成を再現する必要があります。
macOSとの違い
macOSには sha256sum コマンドが標準では含まれておらず、代わりに shasum -a 256 を使います。Linux向けに書いたスクリプトをmacOSに持ち込む際は、このコマンド名の違いに注意してください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
