試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

ファイルのハッシュを計算する

何かのファイル(情報のひとかたまり)に対して、それが元のファイル*1と少しでも違ったものになっていないかを確認するのに、「決まった長さの文字列」という形をした、データにおける指紋のようなもの(ハッシュ)を使用することがある。得られたハッシュ文字列は、「ダイジェスト」とも呼ばれる。
ハッシュに関しての詳細はWikipediaなどを参照。

種類と使い方

ハッシュの種類は多く、coreutils 6.9においては、以下のコマンドでハッシュの計算ができる。

  • md5sum(MD5)
  • sha1sum(SHA-1)
  • sha224sum(SHA-2のSHA-224)
  • sha256sum(SHA-2のSHA-256)
  • sha384sum(SHA-2のSHA-384)
  • sha512sum(SHA-2のSHA-512)

基本的な使い方としては、

$ md5sum [ファイル名]

のようにしてハッシュを端末上に出力するか、

$ md5sum [ファイル名] > [ファイル名].md5

のようにしてファイルに出力する。

下では、「A」という1文字だけのテキストファイルa.txtを作成し、それぞれのコマンドでハッシュを出力している。

$ echo A > a.txt
$ for c in md5sum sha1sum sha224sum sha256sum sha384sum sha512sum; do $c a.txt; done
bf072e9119077b4e76437a93986787ef  a.txt
7d157d7c000ae27db146575c08ce30df893d3a64  a.txt
aaf912fac1a62dc1111040a6172531f7b13fdd32abbf486599b9f867  a.txt
06f961b802bc46ee168555f066d28f4f0e9afdf3f88174c1ee6f9de004fc30a0  a.txt
a6b93896e14c2073d9ebd3feaa5edf447f4ae97ef919ad46535af84c59fbd86e9edc9fe16295641839f7224dff5ad79a  a.txt
7a296fab5364b34ce3e0476d55bf291bd41aa085e5ecf2a96883e593aa1836fed22f7242af48d54af18f55c8d1def13ec9314c926666a0ba63f7663500090565  a.txt

もし、ファイルの内容が変更されたら(下では、「B」という1文字に変更している)

$ echo B >| a.txt
$ for c in md5sum sha1sum sha224sum sha256sum sha384sum sha512sum; do $c a.txt; done
30cf3d7d133b08543cb6c8933c29dfd7  a.txt
31836aeaab22dc49555a97edb4c753881432e01d  a.txt
dca214f39d911854da1948194a3de16877df18ae09a1d4d22be40e9a  a.txt
c0cde77fa8fef97d476c10aad3d2d54fcc2f336140d073651c2dcccf1e379fd6  a.txt
78b7dba4df798ccd236532c2cbcc35eadff2906eba9ab637ea675b6cc12d068d32dd826b8715ad15c3871ab2a750ad5e  a.txt
480a2ddd53e8db95fc737b670302c7ea0914b52ffdb2e961c2ff90887ec2b25873723374da81ae5adafc47ef7ef1c7c5c91243217d41cb904040279b758da0f7  a.txt

ハッシュも変わる。

実際の使用例

KNOPPIXのようなCDイメージをダウンロードしたときに、それが破損していないかを確認するのに、サーバ上にある.md5ファイルの内容と、手元で計算したMD5ハッシュが同じであることを確認する。
以下の例では、作業は、(事前に用意した)イメージファイルとMD5ファイルの両方が存在するディレクトリで行っている。

$ cat knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso.md5
6eb426c67aec7a0c1096b85c26a4874c  knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso
$ md5sum knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso
6eb426c67aec7a0c1096b85c26a4874c  knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso

md5sumなどのコマンドは、-cオプションを付けて、ハッシュの書かれたファイルを付けて実行させると、

$ md5sum -c knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso.md5
knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso: 完了

というように、合っているかどうかの結果のみ知らせてくれる。もし、ハッシュが一致しなければ

knoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.iso: 失敗
md5sum: WARNING: 1 of 1 computed checksum did NOT match

のように、不一致を知らせてくれる。

ハッシュの衝突に関して

WikipediaのMD5に関するページによると、同じハッシュを出力する「元」を複数作り出すこと自体はできるが、ハッシュを「入力」として、(複数存在する)「元」データを「出力」するようなことができているわけではないらしい。
http://ja.wikipedia.org/wiki/SHA も参照。

*1:Web上に配布されているファイルや、自分が過去に作成したファイルなど