大きなデータファイルがオリジナルと同一かを確認する

note.mu の使い方に迷っていたところですが、次世代DNAシーケンサ(NGS)のデータ解析初心者に聞かれたことを淡々と書くのはありかも。特にコンピューティングについては基礎的すぎて、NGS解析という文脈で整理されていないので書く価値があるかもしれません。早速、最近聞かれたことを書きます。

外付けHDDで数TBのデータが *.tar.bz, *.tar.gz などで送られてくるみなさん、こんばんは。受け取ったデータが解凍できない、自分の計算機にコピーしたけど解凍できない、みたいなことありませんか。DNAシーケンスデータのように、大きなファイルはディスクやサーバ間を移動している間に欠けてしまったりします。大きなFASTQの中身を目で比較するのは大変です。ファイルサイズをみるのは良い手のひとつですが厳密ではないです。

厳密にファイルの同一性を担保するには、データの送り主に「md5 チェックサム値を同梱してください」と言いましょう。あるいは自分で元データのmd5を計算しましょう。将来論文を書くときに、大量のデータをNCBI GEOに登録する際にFTPを使います。ここでも md5が要求されますので、必ず必要となる知識です。

md5 はメッセージダイジェストと呼ばれるファイルごとにユニークな fingerprint (指紋)を生成します。どんな大きさ・種類のファイルでも128 bit の指紋にしてしまいます。コピーの前後でこの fingerprint, すなわち、md5値が一致していれば、ファイルの同一性をチェックできます。

MD5値の作り方と検証のしかた

OS X は BSD系なので、md5sum (GNU) コマンドがなく md5 しかないです。Linuxには元から入っています。Windows はそもそも使わないほうが良いでしょう。md5 はチェックサムの検証オプションがないので、md5sum を入れたほうが便利です。homebrew の coreutils のなかに入っています。

1. OS X に homebrew をいれる
http://brew.sh/

2. coreutils を入れる
$ brew install coreutils

3. path を通す
~/.bashrc や ~/.zshenv に以下を記述する。
# coreutils (homebrew)
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

4. 確認

$ which md5sum
/usr/local/opt/coreutils/libexec/gnubin/md5sum

5. md5 を計算する (Linuxユーザはここからやればよいです)

まずデータのあるディレクトリ(仮にdataとする)に移動。

$ cd data

ここには以下のようなファイルがあります。

$ tree

├── fuga.txt
├── hoge.txt
└── data2
    ├── fugahoge.txt
    └── data3
        └── fugahogepiyo.txt

このファイルの md5 を計算します。test.md5 というテキストファイルにその結果を書き込みます。

$ md5sum * > data.md5

もし zsh を使っていれば階層的なディレクトリでも以下でよいので、zsh を使いましょう。

$ md5sum **/* > data.md5

ファイルの中身はこのようになっています。md5値とファイル名が列挙されたテキストファイルです。

$ cat data.md5

1c9c5d7c37e614b4d99eea11672227e  fuga.txt
c59548c3c576228486a1f0037eb16a1b  hoge.txt
a7eeb4420ccbcda90b8e6382ef3ab639  test2/fugahoge.txt
885c737e084bb591b9f113319c453674  test2/test3/fugahogepiyo.txt

6. md5を検証する

大きなデータファイルと共に計算したmd5のファイルもサーバに移動します。移動したサーバへファイルが正常にコピーされたのかを、md5 値を比較することで確認します。Step.5 と同じようにmd5値を計算して目で比較してもよいのですが、ファイルがたくさんあると手間です。md5sum にはmd5値を検証するコマンドがあります。データファイルとmd5ファイルがあるディレクトリで以下のコマンドを入力します。

$ md5sum -c data.md5

fuga.txt: OK
hoge.txt: OK
data2/fugahoge.txt: OK
data2/data3/fugahogepiyo.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match

md5値が一致したファイルはOK、なんらかの理由でファイルが変化してしまったファイルは、FALIEDとなります。

でかいファイルを納品するのにmd5sumがない受託屋にはしっかり付けてもらうように言いましょう。それでも付けない場合は、その業者は使わないほうがよいですね。またサーバにコピーするときは、scp や cp, ftp ではなく、rsync コマンドを使いましょう。rsync は OS X, Linux には入っています。rsync はファイルの同一性をチェックしてくれます。オリジナルファイルをバックアップするときにも md5 は計算しておきましょう。オリジナルのデータが欠けていると取り返しがつきません。

(追記) 人為的なアタックによるファイル改竄に対応するには、sha256sum のほうが良いそうです。情報ありがとうございます。

参考URL: http://ja.wikipedia.org/wiki/%E5%8E%9F%E5%83%8F%E6%94%BB%E6%92%83

mkasahara: 7~8年前だったと思うけどプリイメージアタック http://t.co/SaNqvOatjW でファイルの中身が違うのに同じMD5を持つ、って例を数分で作れることが示されてしまい、どこのセキュリティガイドラインや政府指針からもMD5は外されてる。

この記事が気に入ったらサポートをしてみませんか?