• 締切済み

ハッシュ値について

ハッシュ値をHDDやメディアのファイル破損調査に使用しようかなと思っているのですが、いかがでしょうか? 例えばファイルの保管前にハッシュ値を取得し、その1年後ぐらいに改めてハッシュ値を取得、それを前回のハッシュ値と較べて、一緒であればファイルは破損していません、という考え方でいいのでしょうか? 何らかの理由でHDD・メディア上でファイルが破損し、しかし同じハッシュ値が検出されるということは有り得ないですよね? すいません、どなたかご返事お待ちしております。

みんなの回答

  • qaaq
  • ベストアンサー率36% (146/404)
回答No.5

>前回のハッシュ値と較べて、一緒であればファイルは破損していません、という考え方でいいのでしょうか? 違います。 ”前回と同じ可能性がある”だけです。 完全に一致している事を証明するには、『コピーと照合』するしかありません。 ハッシュ関数は、”衝突”が避けられないです。 実際に、数年前に同じファイルサイズで、md5の値が同じもの(これを”衝突”という)が発見されています。 http://itpro.nikkeibp.co.jp/free/ITPro/Security/20041008/151030/ 利用者の立場では、単一のハッシュ関数に頼るのではなく、 複数のハッシュ関数の一致を確認した方がより安全でしょう。 # これも、『コピー(バックアップ)』より劣りますが。 参考までに、FreeBSDのportsコレクション(*1)では、md5とsha1とファイルサイズが一致した場合”正しい”として動作するように作られています。 *1:FreeBSDでのアプリケーションを手軽にインストールする仕組み。 インターネットを介してファイルの正常性を確認する必要がある。 この手の話題は、”暗号化 ハッシュ関数 md5 sha1”等をキーに検索すると沢山出て来ますね。

  • natu2000
  • ベストアンサー率69% (83/119)
回答No.4

>同じハッシュ値が検出されるということは有り得ないですよね? 例えばAとBのファイルがそれぞれあって 両者はファイルサイズが違っていて明らかに違うだろうと思っていても ハッシュ値が同じなんてことはあります。 これはハッシュの精度?(何パターンの種類?)だと思うのですが 例えばAとBをCRC16でハッシュ値をとってみると同じだが CRC32で取ってみると異なるハッシュ値だった ということがあります。 単純にCRC16とCRC32ではbit?の桁数が上がったので ハッシュパターンも増え、異なった数字が出たに過ぎないわけです とはいえ、やはりCRC32も限界になってくるので md5なんてものがあるわけですが md5もやはり同じ値を示す場合があります(あきらかにファイルサイズが違いのに同一のmd5値など) 現状、ハッシュをとるというのは 精度や普及状態をみるとmd5がモアベターなのですが ほかの人も言うように、ハッシュをとると必然的に ハッシュ値をもとめている時間が掛かります。 例えばファイルサイズにもよるのですが、 数Gだと1-3分ほど待つことになります。 md5は精度が高いので時間が掛かるのですが 例えばCRC16に変更してもG単位では1-3分かかって大差ありません。 当方は、dcfさんと違うのですが、 ・ファイルサイズが同じでもmd5でみたら異なるファイル ・ファイル名はまったく違うがファイルサイズは同じでmd5も同じ (ファイルがなんらかの経路をわたる際に名前を変えた可能性) ・書庫の種類・圧縮率が異なるものの中身は同じ書庫ファイル というのを検索したかったので つまりファイルの重複チェックをしたかったのですが ベクターにこういうソフトって無いんですよね。 結構md5で修復チェックするようなのもあるのですが 総ファイル数1万超えて1つ1つが200Mとか2G単位とか色々あるので もうそんなのまでmd5だと、何時間あっても足りないんですよね でまぁ仕方ないから自分で要件を満たすソフトを自作したんですけどね おかげで2G以上もあるファイルも、 わずか1-2秒足らずでハッシュ値出しますし180秒ぐらいあれば 250-300GのHDぐらいは、丸ごとハッシュ値出せるようになったわけで・・・・・ おっと少し脱線してしまいましたが、 >しかし同じハッシュ値が検出されるということは有り得ないですよね? md5なら確立は低いと思います。 やはりどうしても、md5値が同一でもファイルサイズがハナから 異なっているという状況があることは何万分、何億万分の1程度は あるはずで・・・・・・ありえないことはないという状況です。 ただファイルサイズは同じで、md5値が同じであるけど 実は中身のファイルは異なるなどは、かなり稀でしょう たぶん皆無だと思います。 これだと最早、ファイルサイズは同じで、md5値が同じ ファイルの中身も開いてみたけど同じようだという状況と 一見して開いて黙視して見るまでは同じに見えるわけですから 始末に悪いですよね。 あと老婆心ながら言いますが少し思ったので良いますが md5値からファイルの中身は復元できません。 その時点で壊れていると思うという判断は出来ますが 正常なmd5があれば壊れたファイルで何とか、もとのファイルに戻す なんてことは出来ないので、そこのところは気をつけたほうが良いです。 また海外のソフトでmd5からファイルを作るというソフトがありますが オリジナルと同一のモノは出来ません。 これは先ほど説明したとおりです。念のため。

dcf
質問者

お礼

ありがとうございました。 ハッシュ値はMD5を使用しようと考えております。

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.3

>何らかの理由でHDD・メディア上でファイルが破損し、しかし同じハッシュ値が検出されるということは有り得ないですよね? 異なるファイルから同じハッシュ値が算出される、という可能性はあります。 ただまあ、確率的にあり得ませんが。 ファイルが壊れているかどうかを調べるには、ハッシュはあまり向いていないと思いますよ。 理由は、ファイルの破損は別の手段(破損を防ぐファイルシステムの機能)などで既に保護されているのが一般的で、わざわざハッシュ値を計算する手間を増やしてもメリットがないからです。 また、壊れているのが分かっても回復する手段が無いですし。バックアップでも取った方がよほど前向きです。

dcf
質問者

お礼

ありがとうございました。 バックアップは外付けHDDとCD-RまたはDVD-Rで取ろうと考えております。

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

「前回のハッシュ値と較べて、一緒であればファイルは破損していません、という考え方でいいのでしょうか?」 というのは正しくないです。 「ハッシュ値が違えば、ファイルの内容が変化している(壊れている)」というのは正しいです。逆に言えば「ハッシュ値が一緒でもデータの一部が異なる場合がある」ことになります。 例えば、簡単なハッシュ値の計算として排他的論理和(xor)をとる場合を考えてみましょう。これはデータの値を全て xor することでハッシュ値を求めることができますが、例えばデータの順序が入れ替わってもハッシュ値は変わりません。 基本的に、ハッシュ値で表すことができる場合の数は、ファイルのデータ全てによって表す事ができる場合の数より小さいので、避けようがありません。ハッシュ値が、何ギガバイトもあるデータファイルでも 例えば 256 bit とか程度の数値で表現できる、ことに大きな意味があるからです。 例えばあるディスク内にあるファイルの数が、10 の 9 乗(10億!)個あったとしても、これは 30 bit で表すことができる数ですので、ディスクにあるファイルが同じ、例えば 256 bit のハッシュ値を持つ「可能性」は非常に低いと考えられます。つまりハッシュ値を使えば「同じ内容(かもしれない)ファイル」を容易に識別することが可能になります。 以前、質問者さんと同じような目的で md5 を計算し、ファイルの変更の有無を検出できるよう、簡単なスクリプトを書いたことがありますが、基本的にハッシュの計算にはファイルを全て読み込むため、期待した程高速にはなりませんでした。まあ、以前のバックアップデータを取っておく必要がない、2つのファイルを比べるよりは速い、というのが利点ということでしょうか。 確かに No.1 さんのおっしゃる通り、破損、変更、改ざんを見つけるためにハッシュ値が実際に使われていますが、これは、他により有効な方法がない(見つかっていない)ためです。ということで、100% 確実な方法ではないことにご注意ください。つまりは、全くチェックする方法がない、というよりマシという考え方で使われているのです。

dcf
質問者

お礼

ありがとうございました。 >例えばデータの順序が入れ替わってもハッシュ値は変わりません。 ですが、データの順序とは「1」「0」の順序が変わるということですか? 順序が変わるとファイルの中身ももちろん変わるということですよね。 同じデータで順序が変わったり、「1」「0」の数値が抜けたり増えたりするということは、 データが壊れている、という認識でよろしいでしょうか?

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

>ファイル破損調査に使用しようかなと思っているのですが、いかがでしょうか? 既に利用されていますよ。 特に通信中のデータの破損チェックなどに使われていると思います。 HDD・メディアの破損による、データ破損チェックにも有効だと思います。 フリーソフトも、色々出てますよ。 http://www.vector.co.jp/vpack/filearea/win/util/bin/

dcf
質問者

お礼

ありがとうございます。紹介して頂いたソフトの中でbkhashesを利用していました。