ファイルの同一性を確認するためのハッシュ値計算あれこれ
そのファイルほんとに同一ですか?ってときに使うハッシュ値による確認方法まとめ
■どんなときに使う?
インストールメディアとか、パッチとかが正しいものかの確認したいとき
でかいファイルの転送テストとかのときに、中断して再開して転送完了したけど、そのファイル壊れてないか確認したいとき
■種類
cksum CRC 基本32bit?
md5sum md5 128bit
sha1sum SHA1 160bit
sha256sum SHA256 256bit
他にも下記があって、それぞれ数字がbit長
sha224sum
sha256sum
sha384sum
sha512sum
当然ハッシュ値が長いほうが信頼性が高いです。
出力結果のハッシュ値が同一ならば、そのファイルは同一ですが、各アルゴリズムによって信頼性は変わります。
※短ければ短いほど衝突の可能性が高くなる
ので、確認したい対象と求められる正確性に応じて適宜適当なものを選ぶのが良い気がします。
※大量のファイルをチェックするなら衝突の可能性が一番高いcksumはやめたほうがいいけど、数個のファイルの同一性を確認したいときにそんなに衝突するかという話。
■実行結果と時間
対象をCentOSのインストール用ISO(DVD版)として、各コマンドでハッシュ値を計算してみます。
ついでにtimeコマンドで時間も測ってみます。
実行環境はメイン機のArch。
$ cat /proc/cpuinfo | grep 'model name' model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor model name : AMD Ryzen 5 1500X Quad-Core Processor
実行結果
$ time cksum CentOS-7-x86_64-DVD-1810.iso 2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso real 0m47.911s user 0m15.538s sys 0m1.453s $ time md5sum CentOS-7-x86_64-DVD-1810.iso 5b61d5b378502e9cba8ba26b6696c92a CentOS-7-x86_64-DVD-1810.iso real 0m47.165s user 0m8.858s sys 0m1.454s $ $ time sha1sum CentOS-7-x86_64-DVD-1810.iso 7ac72a080ce8ca79d39804f713684119b908941a CentOS-7-x86_64-DVD-1810.iso real 0m46.512s user 0m3.903s sys 0m1.766s $ $ time sha256sum CentOS-7-x86_64-DVD-1810.iso 6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1 CentOS-7-x86_64-DVD-1810.iso real 0m48.070s user 0m4.953s sys 0m1.993s $ $ $ time sha512sum CentOS-7-x86_64-DVD-1810.iso 332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a CentOS-7-x86_64-DVD-1810.iso real 0m53.131s user 0m9.130s sys 0m1.366s $
意外と時間は変わりませんでした。
realが結構かかってるのは他のいろいろ作業しながらかもしれないけども。
スペックがアレなサーバ機でやってみます。
$ cat /proc/cpuinfo | grep 'model name' model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ model name : AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ $ $ time cksum CentOS-7-x86_64-DVD-1810.iso 2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso real 0m31.085s user 0m19.724s sys 0m3.812s $ $ time md5sum CentOS-7-x86_64-DVD-1810.iso 5b61d5b378502e9cba8ba26b6696c92a CentOS-7-x86_64-DVD-1810.iso real 0m30.702s user 0m13.716s sys 0m4.680s $ $ time sha1sum CentOS-7-x86_64-DVD-1810.iso 7ac72a080ce8ca79d39804f713684119b908941a CentOS-7-x86_64-DVD-1810.iso real 0m30.768s user 0m19.320s sys 0m4.420s $ $ time sha256sum CentOS-7-x86_64-DVD-1810.iso 6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1 CentOS-7-x86_64-DVD-1810.iso real 0m40.900s user 0m36.628s sys 0m3.452s $ $ time sha512sum CentOS-7-x86_64-DVD-1810.iso 332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a CentOS-7-x86_64-DVD-1810.iso real 0m30.863s user 0m24.856s sys 0m3.876s $
これまた意外と時間変わりませんね。256より512が短くなってるのは何かのタイミングの問題でしょう。たぶん。
■ちなみに1
Linux系のインストールイメージとかは検証用に各DLページあたりにハッシュ値が書いてあることが多いです。
指定されたアルゴリズムでDL後のISOファイルを検証してね。
https://www.debian.org/CD/verify
https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7.1810?action=show&redirect=Manuals%2FReleaseNotes%2FCentOS7
■ちなみに2
opensslでも同じことができます。
$ openssl md5 CentOS-7-x86_64-DVD-1810.iso MD5(CentOS-7-x86_64-DVD-1810.iso)= 5b61d5b378502e9cba8ba26b6696c92a $
使えるのは下記
$ openssl list -digest-commands blake2b512 blake2s256 gost md4 md5 mdc2 rmd160 sha1 sha224 sha256 sha3-224 sha3-256 sha3-384 sha3-512 sha384 sha512 sha512-224 sha512-256 shake128 shake256 sm3 $
実際のところ、簡単なファイル同一性確認ならcksumかmd5sum使うことが多いし、メディアやパッチの同一性確認ならDLページの指定形式使いますね。
ファイルの同一性の確認というだけならそんなにこだわらなくてもよいかと思います。