柔軟に働き方を選ぶ時代に必要なこと >>

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

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>前回のハッシュ値と較べて、一緒であればファイルは破損していません、という考え方でいいのでしょうか?



違います。
”前回と同じ可能性がある”だけです。
完全に一致している事を証明するには、『コピーと照合』するしかありません。

ハッシュ関数は、”衝突”が避けられないです。
実際に、数年前に同じファイルサイズで、md5の値が同じもの(これを”衝突”という)が発見されています。

http://itpro.nikkeibp.co.jp/free/ITPro/Security/ …

利用者の立場では、単一のハッシュ関数に頼るのではなく、
複数のハッシュ関数の一致を確認した方がより安全でしょう。
# これも、『コピー(バックアップ)』より劣りますが。

参考までに、FreeBSDのportsコレクション(*1)では、md5とsha1とファイルサイズが一致した場合”正しい”として動作するように作られています。

*1:FreeBSDでのアプリケーションを手軽にインストールする仕組み。
インターネットを介してファイルの正常性を確認する必要がある。

この手の話題は、”暗号化 ハッシュ関数 md5 sha1”等をキーに検索すると沢山出て来ますね。
    • good
    • 0

>同じハッシュ値が検出されるということは有り得ないですよね?



例えば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からファイルを作るというソフトがありますが
オリジナルと同一のモノは出来ません。
これは先ほど説明したとおりです。念のため。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/31 10:07

>何らかの理由でHDD・メディア上でファイルが破損し、しかし同じハッシュ値が検出されるということは有り得ないですよね?



異なるファイルから同じハッシュ値が算出される、という可能性はあります。
ただまあ、確率的にあり得ませんが。

ファイルが壊れているかどうかを調べるには、ハッシュはあまり向いていないと思いますよ。
理由は、ファイルの破損は別の手段(破損を防ぐファイルシステムの機能)などで既に保護されているのが一般的で、わざわざハッシュ値を計算する手間を増やしてもメリットがないからです。

また、壊れているのが分かっても回復する手段が無いですし。バックアップでも取った方がよほど前向きです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/31 10:06

「前回のハッシュ値と較べて、一緒であればファイルは破損していません、という考え方でいいのでしょうか?」



というのは正しくないです。

「ハッシュ値が違えば、ファイルの内容が変化している(壊れている)」というのは正しいです。逆に言えば「ハッシュ値が一緒でもデータの一部が異なる場合がある」ことになります。

例えば、簡単なハッシュ値の計算として排他的論理和(xor)をとる場合を考えてみましょう。これはデータの値を全て xor することでハッシュ値を求めることができますが、例えばデータの順序が入れ替わってもハッシュ値は変わりません。

基本的に、ハッシュ値で表すことができる場合の数は、ファイルのデータ全てによって表す事ができる場合の数より小さいので、避けようがありません。ハッシュ値が、何ギガバイトもあるデータファイルでも 例えば 256 bit とか程度の数値で表現できる、ことに大きな意味があるからです。

例えばあるディスク内にあるファイルの数が、10 の 9 乗(10億!)個あったとしても、これは 30 bit で表すことができる数ですので、ディスクにあるファイルが同じ、例えば 256 bit のハッシュ値を持つ「可能性」は非常に低いと考えられます。つまりハッシュ値を使えば「同じ内容(かもしれない)ファイル」を容易に識別することが可能になります。

以前、質問者さんと同じような目的で md5 を計算し、ファイルの変更の有無を検出できるよう、簡単なスクリプトを書いたことがありますが、基本的にハッシュの計算にはファイルを全て読み込むため、期待した程高速にはなりませんでした。まあ、以前のバックアップデータを取っておく必要がない、2つのファイルを比べるよりは速い、というのが利点ということでしょうか。

確かに No.1 さんのおっしゃる通り、破損、変更、改ざんを見つけるためにハッシュ値が実際に使われていますが、これは、他により有効な方法がない(見つかっていない)ためです。ということで、100% 確実な方法ではないことにご注意ください。つまりは、全くチェックする方法がない、というよりマシという考え方で使われているのです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

>例えばデータの順序が入れ替わってもハッシュ値は変わりません。

ですが、データの順序とは「1」「0」の順序が変わるということですか?
順序が変わるとファイルの中身ももちろん変わるということですよね。
同じデータで順序が変わったり、「1」「0」の数値が抜けたり増えたりするということは、
データが壊れている、という認識でよろしいでしょうか?

お礼日時:2007/05/31 10:05

>ファイル破損調査に使用しようかなと思っているのですが、いかがでしょうか?



既に利用されていますよ。
特に通信中のデータの破損チェックなどに使われていると思います。

HDD・メディアの破損による、データ破損チェックにも有効だと思います。

フリーソフトも、色々出てますよ。

http://www.vector.co.jp/vpack/filearea/win/util/ …
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/31 08:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qレジストリの格納場所

「レジストリ」とはどこにデータが格納されているのでしょうか。
ハードディスク上ですか?
1ファイルとして存在するのですか?

変更方法はわかるのですが、実体はどこにあるのかなと思って質問します。
よろしくお願いします。

Aベストアンサー

ANo.#3の補足。(補足ばっかりですみませんm(__)m)

下記参考URLの下の方にある

[レジストリ ハイブ]   [サポート ファイル]
HKEY_LOCAL_MACHINE\SAM Sam、Sam.log、Sam.sav
HKEY_LOCAL_MACHINE\Security Security、Security.log、Security.sav
・・・・・・

の所です。(".log"、".sav"ファイルはレジストリ本体ではないですが・・・。)

『Microsoft サポートオンライン:Microsoft Windows レジストリの説明』
http://support.microsoft.com/kb/256986/ja/

また、"%SystemRoot%\repair"(通常、"C:\WINDOWS\repair")フォルダにあるファイル群がWindows XPインストール時に作成されたレジストリのバックアップで、レジストリの破損等で起動できなくなった時の修復に使うことが出来ます。(ただし、インストール直後の状態のレジストリに戻ってしまいますし、一部メーカー製PCの場合には、このファイル群が存在しないことがあります。)

『同上:レジストリの破損により Windows XP を起動できなくなった場合の回復方法』
http://support.microsoft.com/kb/307545/ja/

参考URL:http://support.microsoft.com/kb/256986/ja/,http://support.microsoft.com/kb/307545/ja/

ANo.#3の補足。(補足ばっかりですみませんm(__)m)

下記参考URLの下の方にある

[レジストリ ハイブ]   [サポート ファイル]
HKEY_LOCAL_MACHINE\SAM Sam、Sam.log、Sam.sav
HKEY_LOCAL_MACHINE\Security Security、Security.log、Security.sav
・・・・・・

の所です。(".log"、".sav"ファイルはレジストリ本体ではないですが・・・。)

『Microsoft サポートオンライン:Microsoft Windows レジストリの説明』
http://support.microsoft.com/kb/256986/ja/

また、"%SystemRoot%\re...続きを読む


人気Q&Aランキング

おすすめ情報