読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

ファイルのチェックサムを計算する

Linux macOS

ファイルのチェックサムを比較することで、ファイルの複製が正確に行われたのかをある程度の精度で確認することが出来ます (チェックサムが偶然一致する可能性がゼロでは無い為、「絶対」とは言えない為、「ある程度の精度」と表現しています)。例えば、時間をかけてインターネットからダウンロードした OS のイメージファイルが上手く動作しない… といった場合に、「インターネットからのダウンロードに失敗したのか?」「それとも何か設定が悪いのか?」を切り分ける必要が出てきます。こういった場合にチェックサムが一致すれば、少なくても「ダウンロードには成功している」と判断することが出来ます。

現時点のアルゴリズム対応状況

現時点でのコマンド毎のアルゴリズム対応状況は以下でした。「ファイル入力が可能か?」という項目は「予めファイルにチェックサム値を保存しておき、実際のファイルとチェックサムを比較出来る機能が実装されているか?」という意味です。ファイル入力が可能であれば目視で比較する必要もありませんし、複数のファイルを一度に比較することが出来るので非常に便利です。

md5 md5sum openssl dgst shaXXXsum shasum
MD5
SHA1 × ×
SHA224 × ×
SHA384 × ×
SHA512 × ×
SHA512/224 × × × ×
SHA512/256 × × × ×
ファイル入力が可能か? × × ×

Linux は OpenSSL 1.0.1f で確認しました。

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

OS X は OpenSSL 0.9.8zh で確認しました。zh……

$ openssl version
OpenSSL 0.9.8zh 14 Jan 2016

検証に使ったファイル

検証には以下のファイルを使いました。

$ cat test.txt
ABC

md5summd5

Linux

Linux では md5sum を使います。

$ md5sum test.txt
6d0b865b7d33c81b43fabaf044a35f76  test.txt

md5sum では MD5 値を保存したファイルを入力し、チェックサムを検査することが可能です。

$ cat test.md5
6d0b865b7d33c81b43fabaf044a35f76  test.txt
$ md5sum -c test.md5
test.txt: OK

ファイルに複数MD5 値が保存してあれば、複数ファイルのチェックサムを同時に検査することも可能です。

$ cat test123.md5
1181c1834012245d785120e3505ed169  test1.txt
348bd3ce10ec00ecc29d31ec97cd5839  test2.txt
40b134ab8a3dee5dd9760a7805fd495c  test3.txt
$ md5sum -c test.md5
test1.txt: OK
test2.txt: OK
test3.txt: OK

意図的に test2.txt の内容を書き換えて再実行すると、以下のようになりました。

$ md5sum -c test123.md5
test1.txt: OK
test2.txt: FAILED
test3.txt: OK
md5sum: WARNING: 1 computed checksum did NOT match

OS X

OS X には md5sum がありません。その代わりに md5 を使います。しかし、md5 は Linux で一般的な md5sum の出力結果と互換性がありません。どうしても md5sum を使いたい場合は Homebrew で追加インストールする等の対応が必要です。

$ md5 test.txt
MD5 (test.txt) = 6d0b865b7d33c81b43fabaf044a35f76

-r』オプションを指定すると md5sum と互換な出力結果を得られます。

$ md5 -r test.txt
6d0b865b7d33c81b43fabaf044a35f76 test.txt

shasum

shasumPerl で書かれたスクリプトのようです。以下は Ubuntu 14.04.4 LTS での確認結果です。

$ which shasum
/usr/bin/shasum
$ file /usr/bin/shasum
/usr/bin/shasum: Perl script, ASCII text executable

以下は OS X 10.11.4 での確認結果です。

$ which shasum
/usr/bin/shasum
$ file /usr/bin/shasum
/usr/bin/shasum: a /usr/bin/perl script text executable

Linux

shasumperl パッケージに含まれているようです。

$ apt-file search shasum
libdigest-sha-perl: /usr/bin/shasum
libdigest-sha-perl: /usr/share/man/man1/shasum.1p.gz
libsha-ocaml-dev: /usr/share/doc/libsha-ocaml-dev/examples/shasum.ml
perl: /usr/bin/shasum
perl: /usr/share/man/man1/shasum.1.gz
perl-doc-html: /usr/share/doc/perl-doc-html/html/shasum.html

以下は使用例です。

$ shasum -a 1 test.txt
c95ad0ce54f903e1568facb2b120ca9210f6778f  test.txt
$ shasum -a 224 test.txt
7953171b96c398c8596de27894a8390188d6154110ecf4b200e744a9  test.txt
$ shasum -a 256 test.txt
8470d56547eea6236d7c81a644ce74670ca0bbda998e13c629ef6bb3f0d60b69  test.txt
$ shasum -a 384 test.txt
f308cdc131f16d62b0e6bedb637397d00d8e25ac9e9dfd65e291968b47c1c67a4b9415c2af9f0e3c2f9328e6468b62d1  test.txt
$ shasum -a 512 test.txt
2210a60812654e7caa52c9d0e1e88bcdec345780c22dbba5c589d24de20ca6f15db6627b79c445771dac407f2b5062a7ae12b6ca857b078a8d47846edc770e0d  test.txt
$ shasum -a 512224 test.txt
56623918a922d39354c7252e00e70e3620ad5b04b1c0da355148d9b6  test.txt
$ shasum -a 512256 test.txt
eb3b0a5f03f3b686433738407280aa0b76631e3357da269ff3ed1ba943e6180d  test.txt

md5sum 同様、チェックサムを保存したファイルを入力し、チェックサムを検査することも可能です。

$ shasum -c test.sha1
test.txt: OK

OS X

以下は使用例です。

$ shasum test.txt
c95ad0ce54f903e1568facb2b120ca9210f6778f  test.txt
$ shasum -a 1 test.txt
c95ad0ce54f903e1568facb2b120ca9210f6778f  test.txt
$ shasum -a 224 test.txt
7953171b96c398c8596de27894a8390188d6154110ecf4b200e744a9  test.txt
$ shasum -a 256 test.txt
8470d56547eea6236d7c81a644ce74670ca0bbda998e13c629ef6bb3f0d60b69  test.txt
$ shasum -a 384 test.txt
f308cdc131f16d62b0e6bedb637397d00d8e25ac9e9dfd65e291968b47c1c67a4b9415c2af9f0e3c2f9328e6468b62d1  test.txt
$ shasum -a 512 test.txt
2210a60812654e7caa52c9d0e1e88bcdec345780c22dbba5c589d24de20ca6f15db6627b79c445771dac407f2b5062a7ae12b6ca857b078a8d47846edc770e0d  test.txt
$ shasum -a 512224 test.txt
56623918a922d39354c7252e00e70e3620ad5b04b1c0da355148d9b6  test.txt
$ shasum -a 512256 test.txt
eb3b0a5f03f3b686433738407280aa0b76631e3357da269ff3ed1ba943e6180d  test.txt

Linux 同様、チェックサムを保存したファイルを入力し、チェックサムを検査することも可能です。

$ shasum -c test.sha1
test.txt: OK

OpenSSL

openssl dgstチェックサムを計算出来ます。

Linux

以下は使用例です。

$ openssl dgst -md5 test.txt
MD5(test.txt)= 6d0b865b7d33c81b43fabaf044a35f76
$ openssl dgst -md4 test.txt
MD4(test.txt)= 86cb826339b5229fcf7a2a8309be21b5
$ openssl dgst -sha1 test.txt
SHA1(test.txt)= c95ad0ce54f903e1568facb2b120ca9210f6778f
$ openssl dgst -sha test.txt
SHA(test.txt)= 57011fd7fdba34e5760bfe1aa81d6b1100c66d05
$ openssl dgst -sha224 test.txt
SHA224(test.txt)= 7953171b96c398c8596de27894a8390188d6154110ecf4b200e744a9
$ openssl dgst -sha384 test.txt
SHA384(test.txt)= f308cdc131f16d62b0e6bedb637397d00d8e25ac9e9dfd65e291968b47c1c67a4b9415c2af9f0e3c2f9328e6468b62d1
$ openssl dgst -sha512 test.txt
SHA512(test.txt)= 2210a60812654e7caa52c9d0e1e88bcdec345780c22dbba5c589d24de20ca6f15db6627b79c445771dac407f2b5062a7ae12b6ca857b078a8d47846edc770e0d
$ openssl dgst -ripemd160 test.txt
RIPEMD160(test.txt)= f29f8d44cddd3ea9d41fe61d5adae338cde27a41
$ openssl dgst -whirlpool test.txt
whirlpool(test.txt)= c14b76ddc64e0292ce67132a5d428f58dd918f2cdffb2fbe5d0f86dcf3cb1f004a6044599118eaefcbfa95b11cfa65c5bb3aabf59780423babdc10f20ed72e8e

OS X

以下は使用例です。

$ openssl dgst -md5 test.txt
MD5(test.txt)= 6d0b865b7d33c81b43fabaf044a35f76
$ openssl dgst -md4 test.txt
MD4(test.txt)= 86cb826339b5229fcf7a2a8309be21b5
$ openssl dgst -sha1 test.txt
SHA1(test.txt)= c95ad0ce54f903e1568facb2b120ca9210f6778f
$ openssl dgst -sha test.txt
SHA(test.txt)= 57011fd7fdba34e5760bfe1aa81d6b1100c66d05
$ openssl dgst -sha224 test.txt
SHA224(test.txt)= 7953171b96c398c8596de27894a8390188d6154110ecf4b200e744a9
$ openssl dgst -sha256 test.txt
SHA256(test.txt)= 8470d56547eea6236d7c81a644ce74670ca0bbda998e13c629ef6bb3f0d60b69
$ openssl dgst -sha384 test.txt
SHA384(test.txt)= f308cdc131f16d62b0e6bedb637397d00d8e25ac9e9dfd65e291968b47c1c67a4b9415c2af9f0e3c2f9328e6468b62d1
$ openssl dgst -sha512 test.txt
SHA512(test.txt)= 2210a60812654e7caa52c9d0e1e88bcdec345780c22dbba5c589d24de20ca6f15db6627b79c445771dac407f2b5062a7ae12b6ca857b078a8d47846edc770e0d
$ openssl dgst -mdc2 test.txt
MDC2(test.txt)= 6e8cfeced7cc5b5cc9df0930aee60496
$ openssl dgst -ripemd160 test.txt
RIPEMD160(test.txt)= f29f8d44cddd3ea9d41fe61d5adae338cde27a41
$ openssl dgst -md2 test.txt
unknown option '-md2'

shaXXXsum (1, 224, 256, 384, 512)

Linux

Linux では shaXXXsum を使うことも出来ます。shaXXXsumcoreutils に含まれているようです。以下は Ubuntu 14.04.4 LTS での確認結果です。

$ apt-file search sha1sum
9base: /usr/lib/plan9/bin/sha1sum
coreutils: /usr/bin/sha1sum
coreutils: /usr/share/man/man1/sha1sum.1.gz
fish: /usr/share/fish/completions/sha1sum.fish
gnome-commander: /usr/lib/gnome-commander/plugins/sha1sum.py
libpolarssl-runtime: /usr/bin/polarssl_sha1sum
manpages-de: /usr/share/man/de/man1/sha1sum.1.gz
manpages-fr-extra: /usr/share/man/fr/man1/sha1sum.1.gz
manpages-ja: /usr/share/man/ja/man1/sha1sum.1.gz
manpages-pl: /usr/share/man/pl/man1/sha1sum.1.gz
manpages-tr: /usr/share/man/tr/man1/sha1sum.1.gz

以下は使用例です。

$ sha1sum test.txt
c95ad0ce54f903e1568facb2b120ca9210f6778f  test.txt
$ sha224sum test.txt
7953171b96c398c8596de27894a8390188d6154110ecf4b200e744a9  test.txt
$ sha256sum test.txt
8470d56547eea6236d7c81a644ce74670ca0bbda998e13c629ef6bb3f0d60b69  test.txt
$ sha384sum test.txt
f308cdc131f16d62b0e6bedb637397d00d8e25ac9e9dfd65e291968b47c1c67a4b9415c2af9f0e3c2f9328e6468b62d1  test.txt
$ sha512sum test.txt
2210a60812654e7caa52c9d0e1e88bcdec345780c22dbba5c589d24de20ca6f15db6627b79c445771dac407f2b5062a7ae12b6ca857b078a8d47846edc770e0d  test.txt

SHA512 での計算速度比較

以下の仮想マシンで SAH512 の計算速度を比較してみました。

$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 45
model name	: Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz
stepping	: 7
microcode	: 0x710
cpu MHz		: 2400.000
cache size	: 10240 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm arat epb pln pts dtherm tsc_adjust
bugs		:
bogomips	: 4800.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 42 bits physical, 48 bits virtual
power management:

計算対象は Ubuntu 15.10 の .iso イメージを使いました。サイズは 600M 強です。

$ ls -lh ubuntu-15.10-server-amd64.iso
-rw-rw-r-- 1 user user 632M Oct 22 02:39 ubuntu-15.10-server-amd64.iso

結果は以下の通りでした。単位は「秒」です。

No openssl dgst -sha512 sha512sum shasum -a 512
1 2.559 3.942 4.722
2 2.404 3.898 4.662
3 2.396 3.894 4.625
4 2.4 3.946 4.596
5 2.384 3.901 4.678
6 2.413 4.003 4.626
7 2.409 3.992 4.646
8 2.428 3.98 4.678
9 2.39 3.977 4.685
10 2.421 3.985 4.615
平均値 2.4204 3.9518 4.6533