Hash para validação de arquivos

Saudações, hoje vou falar sobre uma questão muito importante sobre segurança e confiabilidade de informações, principalmente para arquivos que são gerenciados por um sistema web. Para intender melhor vamos imaginar a seguinte situação.

Seu sistema gerencia laudos de exames de sangue em pdf para pacientes de uma clinica. E um desses pacientes ta precisando de grana e inventa de burlar o laudo botando um positivo no seu exame de HIV para ver se consegue uma indenização milionária.

Bom é possivel colocar senha para a edição e visualização de um arquivo em PDF, mas todo nós sabemos que mesmo assim tem como burlar isso. Então para a clinica escapar dessa indenização e consecutivamente seu sistema continuar no mercado, o paciente terá que apresentar o PDF com o resultado falso positivo HIV, e tera que ser comparado o arquivo gerado pelo sistema com o do safado paciente. Para fazer isso, acredito eu que a melhor forma é comparar o Hash dos arquivos. Existem vários algoritmos de hash, o que vou utilizar aqui será o MD5. Para isso o PHP tem uma função pronta md5_file, neste exemplo vou fazer genérico para qualquer tipo de arquivo.

O que irá fazer

Vamos fazer um script para um gerenciador de arquivos, ou seja, será enviado varios tipos de arquivos, o sistema ira gerar um hash do mesmo e ira salvar em uma base para futuras comparações. Não vou entrar em detalhes como validar o arquivo enviado, restringir um tipo de dado, tamanho, etc. e nem sobre banco de dados, como armazenar as informações, existem varios tutoriais bons sobre isso, minha idéia é mostrar sobre hash.

Primeiro vamos receber o dowload, copia-lo e ver o hash.

$uploaddir = 'local/';
$uploadfile = $uploaddir . $_FILES['arquivo']['tmp_name'];
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile)) {
$hash = md5_file($uploadfile);
$sql = sprintf("INSERT INTO arquivos ( arq_file, arq_hash) VALUES ('%s','%s')",$uploadfile,$hash);
} else {
echo "Arquivo não foi enviado";
}

É muito interessante que tenha algum código unico para identificar o arquivo no sistema, pois irá facilitar uma busca para comparações.

Agora o trecho de código para comparar os arquivos. A idéia e ter duas entradas. Uma para identificar ou escolher o arquivo que esta no sistema e outra para enviar o arquivo que será comparado. Nesse exemplo vou usar o nome do arquivo para achar ele no sistema. O código a baixo está recebendo essas informações.
* A instancia $conexao é ficticia, utilize o seu método favorito para retornar uma SQL.

$hashSis = $conexao->select("SELECT arq_hahs FROM arquivos WHERE arq_file='".$_POST['nome']."'");
$hashArq =md5_file($_FILES['arquivo']['tmp_name']);
if($hashSis == $hashArq){
echo "Arquivos iguais";
}else{
echo "Arquivos diferente";
}

Esse tipo de válidação é, na minha opnião obrigatória para garantir a segurança das informações em sistemas que gerenciam documentos. Bom a principio é isso ai, qualquer dúvida só entrar em contato.

Deixe um comentário