
Conjunto de ferramentas de hash multiplataforma para cálculo de resumos de mensagens (MD5, SHA-1, SHA-256, Tiger, Whirlpool) com varredura recursiva de diretórios e capacidades de auditoria de integridade de arquivos.
Este é o md5deep, um conjunto de ferramentas multiplataforma para calcular hashes, ou resumos de mensagens, para qualquer número de arquivos, opcionalmente percorrendo recursivamente a estrutura de diretórios. Também pode receber uma lista de hashes conhecidos e exibir os nomes dos arquivos de entrada cujos hashes coincidam ou não com algum dos hashes conhecidos. Esta versão suporta hashes MD5, SHA-1, SHA-256, Tiger e Whirlpool.
Consulte o arquivo NEWS para uma lista de alterações entre versões.
Consulte o arquivo COPYING para informações sobre o licenciamento deste programa.
Consulte o arquivo INSTALL para instruções (genéricas) de compilação e instalação. Aqui está a versão resumida que deve funcionar na maioria dos casos:
sh bootstrap.sh # runs autoconf, automake
./configure
make
make install
Observe que você normalmente precisa ser root para instalar no local padrão. O comando sudo é útil para isso. Você pode especificar um local de instalação alternativo usando a opção --prefix do script configure. Por exemplo, para instalar em /home/foo/bin, use:
$ ./configure --prefix=/home/foo
Há documentação completa sobre como usar o programa na página inicial do projeto, https://github.com/jessek/hashdeep
A versão mais recente é a 4.4. Aqui estão os hashes para as versões Win32:
Por razões históricas, o programa tem opções e funcionalidades diferentes quando executado com os nomes "hashdeep" e "md5deep".
hashdeep possui um recurso chamado "audit" que pode usar uma lista de hashes conhecidos para auditar um conjunto de ARQUIVOS. Erros são reportados para a saída de erro padrão. Se nenhum ARQUIVO for especificado, lê da entrada padrão.
-a Modo de auditoria. Cada arquivo de entrada é comparado com o conjunto de conhecidos. Diz-se que a auditoria passa se cada arquivo de entrada corresponder exatamente a um arquivo no conjunto de conhecidos. Qualquer colisão, arquivo novo ou arquivo ausente fará a auditoria falhar. Usar apenas esta flag produz uma mensagem, "Audit passed" ou "Audit Failed".
-v = imprime o número de arquivos em cada categoria
-v -v = imprime todas as discrepâncias
-v -v -v = imprime os resultados para cada arquivo examinado e cada arquivo conhecido.
-k <arquivo> - A opção -k deve ser usada para carregar o arquivo de auditoria
Para realizar uma auditoria:
hashdeep -r dir > /tmp/auditfile # Gera o arquivo de auditoria
hashdeep -a -k /tmp/auditfile -r dir # Testa a auditoria
Observe que a auditoria é realizada com um arquivo de saída hashdeep padrão. (Internamente, a auditoria é calculada como parte do processo de hashing.)
Sistemas de computador modernos baseados em POSIX consideram nomes de arquivo como uma sequência de bytes que são renderizados conforme a aplicação deseja. Isso significa que nomes de arquivo normalmente contêm ASCII, mas podem conter UTF-8, UTF-16, latin1 ou até mesmo codificações Unicode inválidas.
Sistemas baseados em Windows possuem um conjunto de chamadas de API para nomes de arquivo baseados em ASCII e outro conjunto para nomes de arquivo codificados em UCS-2, que "produz um formato de comprimento fixo simplesmente usando o ponto de código como a unidade de código de 16 bits e produz exatamente o mesmo resultado que UTF-16 para 63.488 pontos de código no intervalo 0-0xFFFF" de acordo com wikipedia. Mas a wikipedia contesta a precisão factual desta afirmação na página de discussão. É bastante claro que ninguém tem certeza absoluta do que o Windows realmente faz, e o próprio Windows pode não ser consistente.
A versão 3 deste programa abordou esse problema usando a variável TCHAR para armazenar nomes de arquivo no Windows e recusando-se a imprimi-los, imprimindo um "?" em vez disso. A versão 4 deste programa traduz strings TCHAR para strings std::string na primeira oportunidade usando a função Windows WideCharToMultiByte. Flags foram adicionadas para escapar Unicode quando é impresso.
Não há maneira (aparentemente) no Windows de abrir um nome de arquivo UTF-8; ele precisa ser convertido de volta para um nome de arquivo multibyte com MultiByteToWideChar.
Felizmente, nunca precisamos realmente converter de volta.
Observe que no Windows os arquivos com hash podem ter caracteres unicode, mas o arquivo com os hashes deve ter um nome ASCII.
COMPILANDO PARA WINDOWS:
-D_UNICODE faz com que TCHAR seja definido como 'wchar_t'.
COMPILANDO PARA POSIX:
-D_UNICODE não está definido, fazendo com que TCHAR seja definido como 'char'.
Anteriormente, funções win32 eram controladas com declarações #ifdef, como abaixo:
#ifdef _WIN32
_wfullpath(d_name,fn,PATH_MAX);
#else
if (NULL == realpath(fn,d_name))
return TRUE;
#endif
Havia também um arquivo chamado tchar-local.h que na verdade alterava a semântica das funções em diferentes plataformas, com coisas como estas:
#define _tcsncpy strncpy
#define _tstat_t struct stat
Isso tornava o código muito difícil de manter.
Com a reescrita 4.0, mudamos esse código com funções C++ que retornam objetos quando possível e evitamos o uso de #defines, de modo que em sistemas _WIN32 a função realpath() é definida antes de seu uso, e o código principal não possui a função realpath(). Você pode ver isso em cycles.cpp:
/* Return the canonicalized absolute pathname in UTF-8 on Windows and POSIX systems */
std::string get_realpath(const TCHAR *fn)
{
#ifdef _WIN32
/*
* expand a relative path to the full path.
* 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
}
Você pode instalar o mingw e então configurar simplesmente com algo como:
$ export PATH=$PATH:/usr/local/i386-mingw32-4.3.0/bin $ ./configure --host=i386-mingw32
O algoritmo MD5 é definido na RFC 1321: http://www.ietf.org/rfc/rfc1321.txt
O algoritmo SHA1 é definido no FIPS 180-1: http://www.itl.nist.gov/fipspubs/fip180-1.htm
O algoritmo SHA256 é definido no FIPS 180-2: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
O algoritmo Tiger é definido em: http://www.cs.technion.ac.il/~biham/Reports/Tiger/
O algoritmo Whirlpool é definido em: http://planeta.terra.com.br/informatica/paulobarreto/WhirlpoolPage.html