这是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”的功能,可以使用已知哈希列表来审核一组FILES。错误报告到标准错误。如果未指定FILES,则从标准输入读取。
-a 审计模式。每个输入文件与已知集进行比较。如果每个输入文件正好与已知集中的某一个文件匹配,则审计通过。任何冲突、新文件或丢失文件都会导致审计失败。单独使用此标志会产生一条消息,即"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的文件名,根据wikipedia的说法,UCS-2“通过简单地使用码点作为16位代码单元来产生固定长度的格式,并且对于0-0xFFFF范围内的63,488个码点,产生与UTF-16完全相同的结果”。但维基百科的讨论页上对此声明的准确性存在争议。显然,没有人完全确定Windows实际上做了什么,而Windows本身可能并不一致。
本程序版本3通过使用TCHAR变量在Windows上保存文件名,并在打印时拒绝打印它们,而是打印“?”来解决此问题。本程序版本4会尽快将TCHAR字符串转换为std::string字符串,使用Windows函数WideCharToMultiByte。已添加标志以在打印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++函数,并避免使用#define,这样在_WIN32系统上,函数realpath()在其使用之前被定义,而主线代码中则没有realpath()函数。您可以在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,然后简单地使用类似以下方式配置:
$ 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