Para ter certeza que o conteúdo de um arquivo não foi alterado você pode gerar um checksum deste arquivo. Um checksum é um valor short ou string que é criado usando o conteúdo do arquivo. O Cálculo do checksum de arquivos com conteúdos idênticos irá gerar resultados idênticos, mas se o conteúdo dos arquivos for diferente então valores de checksum diferentes serão obtidos. Um bom algoritmo para gerar checksum deve ser muito sensível a qualquer mudança na fonte dos dados.
CheckSum - Pode ser entendido também como um sistema de checagem (Cálculo de CRC - Cycling redundance check) que consiste em verificar um arquivo ou pacote de dados utilizando um código enviado no início da transmissão. O código é usado pelo receptor para verificar se a transmissão está completa e se o arquivo não está corrompido.
Vamos mostrar a seguir como gerar o checksum no VB 2005
Crie uma nova aplicação do tipo Windows Forms e inclua dois controles TextBox chamados txtArquivo e lblCheckSum e um controle Button chamado btnGerarCheckSum. A seguir defina a propriedade lblCheckSum.ReadOnly como True. Abaixo temos o layout do formulário criado:
Os namespaces usados no projeto são:
Imports System.Text
Imports System.Security.Cryptography
O código do botão - Gerar CheckScum - é dado a seguir:
Private Sub btnGeraCheckSum_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGeraCheckSum.Click
Dim checksum As Byte()
Dim contador As Integer
Dim resultado As String
' ----- Gera o checksum para o arquivo
Try
checksum = GeraChecksum(txtArquivo.Text)
Catch ex As Exception
MsgBox("Ocorreu um erro ao tentar calcular o checksum :" & vbCrLf & vbCrLf & ex.Message)
Exit Sub
End Try
' ----- Prepara a exibição do checksum
If (checksum Is Nothing) Then
resultado = "CheckSum não calculado."
Else
' ----- Converte o checksum para algo legível
resultado = ""
For contador = 0 To checksum.Length - 1
resultado &= String.Format("{0:X2}", checksum(contador))
Next contador
End If
' ----- exibe o resultado ao usuário
lblchecksum.BackColor = Color.Yellow
lblchecksum.Text = resultado
End Sub
A rotina que efetua a geração do checkSum usando as funções de Hash é dado a seguir:
Public Function GeraChecksum(ByVal filePath As String) As Byte()
' ----- Usa a função hashing HMACSHA1 para gerar o checksum para o arquivo
Dim hashingFunction As HMACSHA1
Dim hasingBase() As Byte
Dim hashValue() As Byte
Dim inStream As IO.Stream
' ----- verifica seo arquivo existe
If (My.Computer.FileSystem.FileExists(filePath) = False) Then
Throw New IO.FileNotFoundException
Return Nothing
End If
' ----- Prepara a chave de hashing. Voce tem que usar
' a mesma chave de hashing todo o tempo senão
' irá obter valores inconsistentes
hasingBase = (New UnicodeEncoding).GetBytes("Macoratti")
' ----- Cria o componente hashing usando a função SHA-1
hashingFunction = New HMACSHA1(hasingBase, True)
' ----- abra o arquivo como um stream
inStream = New IO.FileStream(filePath,IO.FileMode.Open, IO.FileAccess.Read)
' ----- Calcula o valor checksum.
hashValue = hashingFunction.ComputeHash(inStream)
' ----- fecha o arquivo
inStream.Close()
' ----- Retorna o checksum como um array de bytes
Return hashValue
End Function
Executando o projeto e selecionando um arquivo existente chamado checksum.txt para gerar o checksum o resultado obtido é mostrado a seguir:
Os valores de CheckSum são especialmente úteis quando você quer saber se dois arquivos , ou dois conjuntos de dados, contêm conteúdo idêntico. Eles são tipicamente gerados usando um algoritmo de hashing - um método de processamento que toma uma parte do conteúdo original e gera um valor condensado representando o conteúdo completo.
Um hash é uma seqüência de letras ou números geradas por um algoritmo de dispersão.
Essa seqüência busca identificar um arquivo ou informação unicamente. Por exemplo: uma mensagem de correio eletrônico, uma senha, uma chave criptográfica ou mesmo um arquivo. É um método para transformar dados de tal forma que o resultado seja (quase) exclusivo. Além disso, funções usadas em criptografia garantem que não é possível a partir de um valor de hash retornar à informação original.
Como a seqüência do hash é limitada, muitas vezes não passando de 512 bytes, existem diversas colisões (seqüências iguais para dados diferentes). Quanto maior for a dificuldade de se criar colisões intencionais, melhor é o algoritmo.
Uma função de hash recebe um valor de um determinado tipo e retorna um código para ele. Enquanto o ideal seria gerar identificadores únicos para os valores de entrada, isso normalmente não é possível: na maioria dos casos, o contra-domínio de nossa função é muito menor do que o seu domínio, ou seja, x (o tipo de entrada) pode assumir uma gama muito maior de valores do que hash(x) (o resultado da função de hash).
Os mais usados algoritmos de hash são os 16 bytes: MD2, MD4, MD5 ou o SHA-1, de 20 bytes. Características de alguns algoritmos:
1 - MD4: Desenvolvido em 1990/91 por Ron Rivest, vários ataques foram detectados, o que fez com que o algoritmo fosse considerado frágil.
2 - SHA-1 (Secure Hash Algorithm): Desenvolvido pelo NIST e NSA e é considerado como o mais seguro atualmente.
fonte - Wikipédia - http://pt.wikipedia.org/wiki/Hash
Os algoritmos hashing processam a entrada de dados em blocos. Como um hash é calculado para cada bloco, o próximo bloco é produzido e usado ou sobreposto em um hash existente. Esta constante mesclagem de dados torna o algoritmo sensível a qualquer mudança no seu conteúdo original.
A .NET Framework incluí diversos algoritmos de hashing e características de criptografia no namespace System.Security.Cryptography. O código do exemplo mostrado acima usa a classe HMACSHA1 (Hash-based Message Authentication Code, ou HMAC, via a função de hash SHA-1) do namespace System.Security.Cryptography para gerar o hash.
As funções de hash como a função SHA-1 foram desenvolvidas por organizações privadas e agências de segurança do governo para ajudar a proteger informações. Diversas funções de hash similares e algoritmos de cifragem estão incluídas neste namespace para serem usadas conforme sua necessidade.
Por José Carlos Macoratti - www.macoratti.net