VB .NET - O Calculando o CheckSum para um arquivo


Para ter certeza que o conteúdo de um arquivo não foi alterado você pode gerar um checksum deste arquivo de forma a ser comparado após o arquivo se processado quer via download ou outro meio. Se o valor não mudar temos a garantia que o arquivo é o mesmo.

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 .NET

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 leiaute 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.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti