
メッセージダイジェスト(MD5、SHA-1、SHA-256、Tiger、Whirlpool)を計算するためのクロスプラットフォームハッシュツールセット。再帰的なディレクトリトラバーサルとファイル整合性監査機能を備えています。
これはmd5deepです。任意の数のファイルに対してハッシュ(メッセージダイジェスト)を計算し、オプションでディレクトリ構造を再帰的に探索するクロスプラットフォームツールのセットです。また、既知のハッシュのリストを受け取り、入力ファイルのハッシュが既知のハッシュのいずれかに一致するか一致しないかに応じてファイル名を表示することもできます。このバージョンはMD5、SHA-1、SHA-256、Tiger、Whirlpoolハッシュをサポートしています。
リリース間の変更点については、ファイル NEWS を参照してください。
このプログラムのライセンス情報については、ファイル COPYING を参照してください。
(一般的な)コンパイルおよびインストール手順については、ファイル INSTALL を参照してください。以下は多くの場合にそのまま動作する簡略版です:
sh bootstrap.sh # autoconf, automake を実行
./configure
make
make install
デフォルトの場所にインストールするには、通常 root 権限が必要です。その場合は sudo コマンドが便利です。configure スクリプトの --prefix オプションを使用して、別のインストール場所を指定できます。例えば、/home/foo/bin にインストールするには次のようにします:
$ ./configure --prefix=/home/foo
プログラムの使用方法に関する完全なドキュメントはプロジェクトのホームページにあります:https://github.com/jessek/hashdeep
最新リリースはバージョン4.4です。以下はWin32版のハッシュです:
歴史的な理由により、このプログラムは"hashdeep"および"md5deep"という名前で実行された場合に異なるオプションと機能を持ちます。
hashdeepには"audit"(監査)機能があり、既知のハッシュのリストを使用して一連のファイルを監査できます。 エラーは標準エラー出力に報告されます。ファイルが指定されていない場合は、標準入力から読み取ります。
-a 監査モード。各入力ファイルが既知のハッシュのセットと照合されます。
監査は、各入力ファイルが既知のセット内のちょうど1つのファイルと一致した場合に
合格とみなされます。衝突、新しいファイル、欠落ファイルがあると監査は失敗します。
このフラグのみを使用すると、"Audit passed" または "Audit Failed" のメッセージが表示されます。
-v = 各カテゴリのファイル数を表示
-v -v = すべての不一致を表示
-v -v -v = 調査したすべてのファイルと既知のすべてのファイルの結果を表示
-k <file> - 監査ファイルをロードするには -k オプションを使用します
監査を実行するには:
hashdeep -r dir > /tmp/auditfile # 監査ファイルを生成
hashdeep -a -k /tmp/auditfile -r dir # 監査をテスト
監査は標準のhashdeep出力ファイルを使用して実行されることに注意してください。(内部的には、監査はハッシュ処理の一部として計算されます。)
POSIXベースの現代的なコンピュータシステムでは、ファイル名はアプリケーションが望むように表示されるバイトのシーケンスと見なされます。つまり、ファイル名には通常ASCIIが含まれますが、UTF-8、UTF-16、latin1、または無効なUnicodeエンコーディングも含まれる可能性があります。
Windowsベースのシステムには、ASCIIベースのファイル名用のAPIコールセットと、UCS-2(「単にコードポイントを16ビットコードユニットとして使用することで固定長フォーマットを生成し、範囲0-0xFFFFの63,488コードポイントに対してUTF-16とまったく同じ結果を生成する」とwikipediaにある)でエンコードされたファイル名用の別のAPIコールセットがあります。しかしwikipediaのトークページでは、この記述の事実正確性が議論されています。Windowsが実際に何を行っているか誰も完全には確信しておらず、Windows自身も一貫していない可能性があることは明らかです。
このプログラムのバージョン3では、WindowsでTCHAR変数を使用してファイル名を保持し、それらを表示せず代わりに"?"を表示することでこの問題に対処していました。バージョン4では、Windows関数WideCharToMultiByteを使用して、できるだけ早くTCHAR文字列をstd::string文字列に変換します。Unicodeを表示するときにエスケープするためのフラグが追加されました。
WindowsでUTF-8のファイル名を開く方法は(どうやら)ありません。MultiByteToWideCharを使用してマルチバイトファイル名に戻す必要があります。
幸いなことに、実際に戻す必要はほとんどありません。
Windowsでは、ハッシュ化されるファイルにUnicode文字を含めることができますが、ハッシュが含まれるファイルはASCII名でなければならないことに注意してください。
WINDOWS用のコンパイル:
-D_UNICODE を定義すると、TCHAR が 'wchar_t' として定義されます。
POSIX用のコンパイル:
-D_UNICODE が定義されていないため、TCHAR は 'char' として定義されます。
以前は、win32関数は #ifdef 文で制御されていました。例えば次のように:
#ifdef _WIN32
_wfullpath(d_name,fn,PATH_MAX);
#else
if (NULL == realpath(fn,d_name))
return TRUE;
#endif
また、tchar-local.hというファイルがあり、実際に異なるプラットフォームで関数のセマンティクスを変更していました。例えば次のようなものです:
#define _tcsncpy strncpy
#define _tstat_t struct stat
これによりコードのメンテナンスが非常に困難になりました。
4.0の書き直しでは、可能な場合はオブジェクトを返すC++関数を使用し、_WIN32システムでは realpath() 関数が使用前に定義され、メインラインコードには realpath() 関数が存在しないように #define の使用を避けるようにコードを変更しました。これは cycles.cpp で確認できます:
/* WindowsとPOSIXシステムでUTF-8の正規化された絶対パスを返す */
std::string get_realpath(const TCHAR *fn)
{
#ifdef _WIN32
/*
* 相対パスをフルパスに展開する。
* http://msdn.microsoft.com/en-us/library/506720ff(v=vs.80).aspx
*/
TCHAR absPath[PATH_MAX];
if(_fullpath(absPath,fn,PAT_HMAX)==0) return "";
return tchar_to_utf8(absPath);
#else
char resolved_name[PATH_MAX]; //
if(realpath(fn,resolved_name)==0) return "";
return string(resolved_name);
#endif
}
mingwをインストールし、次のようにconfigureを実行できます:
$ export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin $ ./configure --host=i386-mingw32
MD5アルゴリズムはRFC 1321で定義されています: http://www.ietf.org/rfc/rfc1321.txt
SHA1アルゴリズムはFIPS 180-1で定義されています: http://www.itl.nist.gov/fipspubs/fip180-1.htm
SHA256アルゴリズムはFIPS 180-2で定義されています: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
Tigerアルゴリズムは以下で定義されています: http://www.cs.technion.ac.il/~biham/Reports/Tiger/
Whirlpoolアルゴリズムは以下で定義されています: http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html