Mostrando postagens com marcador hash. Mostrar todas as postagens
Mostrando postagens com marcador hash. Mostrar todas as postagens

domingo, 26 de maio de 2013

Atualizando o caminho dos arquivos numa listagem de hash

Recentemente, eu estava com uma estrutura de arquivos em diversos diretórios e subdiretórios e todos eles já estavam com os respectivos hashes MD5 armazenados em um arquivo texto (hash.md5) no diretório raiz. Bastava executar o comando "md5sum -c hash.md5" na raiz para a ferramenta verificar a integridade de todos os arquivos.

Entretanto, resolvi reorganizar a localização dos arquivos, mudando os arquivos de subdiretórios, criando diretórios novos etc. Eram os mesmos arquivos só que agora estavam em caminhos de diretórios diferentes. Com isso, após estas mudanças, o arquivo texto com os hashes MD5 também precisava ser atualizado para os novos caminhos dos arquivos.

Algumas soluções poderiam ser aplicadas. Uma seria recalcular todas as somas MD5, gerando novamente os hash de todos os arquivos, mas esta solução iria expor novamente o disco rígido em um uso intenso. Eram muitos gigabytes de dados armazenados. Outra solução seria editar o arquivo texto com os hashes, alterando cada linha para o novo caminho do respectivo arquivo. Mas era um arquivo com 1650 linhas e fazer isso manualmente torna impraticável, levaria uma eternidade.

Contudo a segunda era a solução que deveria ser aplicada, afinal os hashes dos arquivos já estavam gerados e só precisava atualizar os caminhos. O que poderia executar esta tarefa rapidamente? Simples, um script no interpretador de comandos.

A seguir, está o código do script que realizou a atualização dos caminhos, de cada arquivo, nas linhas do arquivo texto com os hashes MD5. É um script para o interpretador de comandos Bash, do Linux.

O que ele faz é, primeiramente, uma cópia de segurança do arquivo texto com os hashes. Depois será lida cada linha deste arquivo, onde serão armazenados em variáveis o hash (incluindo os espaços) que está no início da linha e o nome do respectivo arquivo, ignorando o caminho antigo. Então será realizada uma busca pelo arquivo e seu caminho atual é armazenado em outra variável. Por fim, as strings com o hash e o caminho atual são concatenadas e direcionadas para um novo arquivo texto com os hashes MD5.


#!/bin/bash
#

cp -f hash.md5 hashantigo.md5

while read LINHA
do

  HASH=`echo "$LINHA" | cut -c 1-34`
  ARQUIVO=`echo "$LINHA" | sed 's/^.\{34\}//' - | sed 's/.*\///' -`
  NOVODIR=`find */ -iname "$ARQUIVO" -type f -print`
  if [[ $NOVODIR ]]
  then
    echo "$HASH""$NOVODIR" >> novohash.md5
  fi

done < hashantigo.md5

mv -f novohash.md5 hash.md5

echo "Feito!"



Este script torna o processo muito mais rápido e menos traumático no acesso ao disco. Nesta reorganização, eu também separei os arquivos em volumes de aproximadamente 4.4 GB (capacidade de DVDs) pois foram gravados em mídias óticas. Cada volume tinha o seu "diretório raiz" com uma cópia do arquivo texto original com os hashes e o script. O script foi executado para cada volume. Por isso a necessidade do if no script, alguns arquivos não estavam no respectivo volume.

São diversos comandos do Bash, internos e externos, utilizados neste script. As páginas manuais de cada um deles podem ajudar no entendimento de sua execução.

domingo, 9 de dezembro de 2012

Falha de EOL em verificação de hash

Quem utiliza o sistema Linux no dia a dia e costuma verificar a integridade de arquivos através de comparações com hash, seja MD5, SHA etc. em suas respectivas ferramentas para linha de comando, provavelmente já presenciou falhas em determinadas verificações.

Os sistemas operacionais não adotam a mesma convenção para os caracteres que marcam o fim-de-linha (EOL) em arquivos de texto puro. Principalmente entre os sistemas DOS/Windows e Unix/Linux.  Como o arquivo de hash é um arquivo no formato texto, está sujeito a esta diferença em sua estrutura, caso ele tenha sido criado em um sistema ou no outro.

Ao ler um arquivo de hash, criado em um sistema Windows, ou seja, com o fim-de-linha adotado no sistema Windows, em uma ferramenta de linha de comando no Linux, haverá falha na busca do arquivo principal, o qual se pretende verificar a integridade. Algo como apresentado no exemplo a seguir:

$ sha1sum -c FreeOTFE_5_21.sha1

: Arquivo ou diretório não encontrado
: FALHOU na abertura ou na leitura
sha1sum: WARNING: 1 listed file could not be read



A solução, no sistema Linux, é converter o arquivo de hash para o formato do Unix. O comando 'dos2unix' serve para isso:

$ dos2unix FreeOTFE_5_21.sha1

dos2unix: converting file FreeOTFE_5_21.sha1 to Unix format ...



Feito isso, a verificação da integridade provavelmente não terá mais esta falha na busca do arquivo principal:

$ sha1sum -c FreeOTFE_5_21.sha1

FreeOTFE_5_21.exe: SUCESSO



Claro que o erro da integridade ainda poderá ocorrer, visto que neste caso é o arquivo principal que estará corrompido. Importante salientar que esta não é a única falha que pode ocorrer na interpretação do arquivo de hash. Algumas ferramentas de geração de hash produzem arquivos de hash com informações adicionais incluídas junto com a sequência hash, ou também em posições invertidas entre a sequência e o caminho pro arquivo principal. Tudo isso pode gerar falha na busca do arquivo. Casos assim deverão ser tratados particularmente.

Leia mais sobre EOL em http://dan-scientia.blogspot.com.br/2009/07/historia-do-fim-de-linha.html

quarta-feira, 6 de janeiro de 2010

Verifique a integridade dos seus downloads

Durante um processo de cópia de qualquer arquivo no computador é possível acontecer uma falha na comunicação da origem para o destino. Muitas vezes o software que está executando o processo de cópia não percebe e retorna para o sistema o sucesso da cópia. A cópia do arquivo aparenta estar normal porém ao realizar sua execução acontece um erro.

Este tipo de problema é bastante comum de acontecer em downloads de arquivos pela Internet. Não é sempre mas pode ocorrer de um único byte vir incorreto ou inexistente no arquivo. E pode ser um transtorno se este arquivo for por exemplo uma imagem de CD ou DVD, onde o erro só vai ser percebido depois de gravá-la em uma mídia e então executar o software contido.

Para possibilitar uma verificação da cópia do arquivo e assim evitar que um usuário fique com um arquivo corrompido, muitos administradores de repositórios de softwares disponibilizam um arquivo ou uma página no site contendo o valor hash do arquivo. Desta forma o usuário pode confirmar a integridade do arquivo.

Um hash é uma sequência de bits gerada por um algoritmo de dispersão formando uma sequência de caracteres alfanuméricos, geralmente na base hexadecimal de 0 a 9 e de A a F, representando 1/2 byte cada. Basicamente a sequência hash é a transformação de uma grande quantidade de dados em uma pequena quantidade de dados.

Esta seqüencia busca identificar um arquivo unicamente. É um método para transformar dados de tal forma que o resultado seja praticamente exclusivo. Mas como a seqüencia do hash é limitada, muitas vezes não passando de 512 bits, existem colisões ocasionando sequências iguais para dados diferentes.

Não é possível a partir de um valor de hash retornar à informação original, esta transformação então é somente unidirecional.

Os algoritmos de hash mais usados para este propósito são: MD5, com 128 bits; SHA1, com 160 bits e o SHA256, com 256 bits. Os hashes MD5 são representados por uma sequência de 32 caracteres hexadecimais, os hashes SHA1 e o SHA256 são representados por sequências de 40 e 64 caracteres, respectivamente.

Quando localizar um arquivo para download em um site, procure se informar se existe disponível o valor hash do arquivo. Este valor pode vir dentro de um outro arquivo em formato texto, comumente com nomes semelhantes à checksum, md5sum, sha1sum, ou pode apenas estar incluído no conteúdo da página de download do arquivo.

Para o sistema Windows é necessário instalar o utilitário que irá verificar a integridade, por exemplo para hash MD5 existe o software chamado MD5summer (http://www.md5summer.org/). Existem outros utilitários que funcionam com os algoritmos mais comuns de hash, uma pesquisada pelo Google vai ser suficiente para encontrá-los. Já o sistema Linux costuma trazer na instalação padrão estes utilitários. A execução do comando "md5sum " retorna a sequência com o valor hash MD5 do arquivo informado. Outros comando são o sha1sum e o sha256sum, para os hashes SHA.

Basta comparar o valor retornado com o fornecido no site. Se forem idênticos então o arquivo está OK. Uma forma automática é executar o utilitário informando o arquivo que contém a sequência hash, desta forma o retorno será a resposta OK ou não.

Outro proveito destes utilitários é para o controle da integridade de suas cópias particulares. Cópias de segurança, transferências de arquivos pela rede ou a utilização de uma unidade de armazenamento externa para transportar os arquivos etc. O procedimento é gerar os valores hashes antes de realizar a cópia e ao final verificar os arquivos copiados.

A grande maioria dos repositórios de softwares para o sistema Linux adotam este controle de integridade dos arquivos.