CUBE SUGAR CONTAINER

技術系のこと書きます。

coreutils の *sum を使ってワンライナーでハッシュ値を検証する

何処からかファイルをダウンロードしたときは、念のためハッシュ値が合っているか確認する場合があると思う。 今回は、そんなハッシュ値の検証をワンライナーでやる方法について。 シェルスクリプトとかで使うと便利だと思う。

動作確認に使った環境は次の通り。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS"
$ uname -r
4.15.0-50-generic

下準備

たぶん既に入ってるけど coreutils をインストールしておく。

$ sudo apt-get -y install coreutils

ちなみに macOS でも Homebrew で coreutils をインストールすれば同じようにいける。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.4
BuildVersion:   18E226
$ brew install coreutils

サンプルファイルを用意する

例として、次のようなファイルを用意する。

$ echo "Hello, World" > greet.txt

このファイルの MD5 のハッシュ値は次の通り。

$ md5sum greet.txt
9af2f8218b150c351ad802c6f3d66abe  greet.txt

ハッシュ値が一致するかチェックする

例えば、このファイルがいつの間にか改ざんされて中身が書き換わっていないか確認したいとする。 そんなときは記録しておいたハッシュ値とファイル名を md5sum コマンドに -c オプションと共に標準入力から渡す。

$ echo "9af2f8218b150c351ad802c6f3d66abe  greet.txt" | md5sum -c -
greet.txt: OK

すると、渡されたハッシュ値とファイル名を元に比較して一致しているかをチェックできる。

試しに、ファイルをちょっとばかり変更してみよう。

$ echo "Good bye, World" > greet.txt

これで、当然ながらハッシュ値は全く違ったものになる。

$ md5sum greet.txt 
92214ff18f0f6ba9620d271b91add216  greet.txt

この状況で、先ほどと同じハッシュ値と共に md5sum で検証してみる。

$ echo "9af2f8218b150c351ad802c6f3d66abe  greet.txt" | md5sum -c -
greet.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

ちゃんとエラーになった。

リターンコードについても非ゼロの値がセットされている。

$ echo $?
1

確認できたらファイルは元に戻しておく。

$ echo "Hello, World" > greet.txt

SHA 系でも試してみる。

念のため SHA 系のコマンドでも確認しておこう。

まずは sha1sum コマンドから。

$ sha1sum greet.txt
4ab299c8ad6ed14f31923dd94f8b5f5cb89dfb54  greet.txt
$ echo "4ab299c8ad6ed14f31923dd94f8b5f5cb89dfb54  greet.txt" | sha1sum -c -
greet.txt: OK

よさそう。

続いて sha256sum コマンドについても。

$ sha256sum greet.txt 
8663bab6d124806b9727f89bb4ab9db4cbcc3862f6bbf22024dfa7212aa4ab7d  greet.txt
$ echo "8663bab6d124806b9727f89bb4ab9db4cbcc3862f6bbf22024dfa7212aa4ab7d  greet.txt" | sha256sum -c -
greet.txt: OK

ばっちり。

複数のファイルを一度にチェックする

ちなみに複数のファイルを一度にチェックすることもできる。

例えばファイルを一つ追加しておく。

$ echo "Konnichiwa, Sekai" > aisatsu.txt

MD5 のハッシュ値は次の通り。

$ md5sum aisatsu.txt 
6656d68759745ed46727e0b42e4121b5  aisatsu.txt

複数のファイルを一度にチェックするときは、次のように複数行に渡って対応関係を渡せば良い。

$ cat << 'EOF' | md5sum -c -
9af2f8218b150c351ad802c6f3d66abe  greet.txt
6656d68759745ed46727e0b42e4121b5  aisatsu.txt
EOF
greet.txt: OK
aisatsu.txt: OK

いじょう。