Olá! Friday, 19 de April de 2024.



Dicas CódigoFonte.net
Thursday, 04 de January de 2007

O Calculando o CheckSum para um arquivo em VB.NET

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:

Clique para ver a imagem em seu tamanho real

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:

Clique para ver a imagem em seu tamanho real

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

Comentários do artigo [Novo comentário]

Nenhum comentário, seja o primeiro a comentar.
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:


CodigoFonte.net » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010