Calcolo e confronto di valori hash con Visual Basic .NET o Visual Basic 2005

Traduzione articoli Traduzione articoli
Identificativo articolo: 301053 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato precedentemente pubblicato con il codice di riferimento I301053
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Con le classi System.Security.Cryptography di Microsoft .NET Framework è possibile calcolare facilmente un valore hash per i dati di origine. In questo articolo viene illustrato come ottenere un valore hash e come confrontare due valori hash per verificare se sono identici.

<A NAME="bottom" HREF="#toc">Torna all'inizio</A>

Requisiti

Nell'elenco riportato di seguito sono indicati l'hardware, il software, l'infrastruttura di rete e i Service Pack necessari:
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005

Calcolo di un valore hash

È facile generare e confrontare valori hash utilizzando le risorse di crittografia contenute nello spazio dei nomi System.Security.Cryptography. Poiché tutte le funzioni hash utilizzano input di tipo Byte[], può essere necessario convertire l'origine in una matrice di byte prima di eseguirne l'hashing. Per creare un valore hash per un valore stringa, attenersi alla procedura descritta di seguito:
  1. Aprire Visual Studio .NET o Visual Studio 2005.
  2. Creare una nuova applicazione console in Visual Basic .NET o in Visual Basic 2005. Verranno automaticamente creati un modulo e una procedura Main() vuota.
  3. Assicurarsi che il progetto faccia riferimento agli spazi dei nomi System e System.Security.
  4. Utilizzare l'istruzione Imports per gli spazi dei nomi System, System.Security, System.Security.Cryptographic e System.Text in modo che non sia necessario qualificare le dichiarazioni nel codice successivamente. Queste istruzioni devono essere utilizzate prima di qualsiasi altra dichiarazione.
    Imports System
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text
    			
  5. Dichiarare una variabile stringa, che dovrà contenere i dati di origine e due matrici di byte (di dimensione indefinita), che dovranno contenere a loro volta i byte di origine e il valore hash risultante.
    Dim sSourceData As String
    Dim tmpSource() As Byte
    Dim tmpHash() As Byte
    			
  6. Utilizzare la funzione GetBytes(), inclusa nella classe System.Text.ASCIIEncoding.ASCII, per convertire la stringa di origine in una matrice di byte, necessaria come input della funzione di hashing.
    sSourceData = "MySourceData"
    'Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)
    					
  7. Calcolare l'hash MD5 per i dati di origine chiamando ComputeHash in un'istanza della classe MD5CryptoServiceProvider. Per calcolare un altro valore hash, sarà necessario creare un'altra istanza della classe.
    'Compute hash based on source data.
    tmpHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource) 					
  8. La matrice di byte tmpHash ora contiene il valore hash calcolato (valore a 128 bit=16 byte) per i dati di origine. Risulta spesso utile visualizzare o memorizzare un valore come questo sotto forma di stringa esadecimale. A tale scopo, è possibile utilizzare il codice seguente:
    Console.WriteLine(ByteArrayToString(tmpHash))  
    
    Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
        Dim i As Integer
        Dim sOutput As New StringBuilder(arrInput.Length)
        For i = 0 To arrInput.Length - 1
            sOutput.Append(arrInput(i).ToString("X2"))
        Next
        Return sOutput.ToString()
    End Function 					
  9. Salvare e quindi eseguire il codice per ottenere la stringa esadecimale per il valore di origine.

Confronto di due valori hash

Uno degli scopi della creazione di un valore hash da dati di origine è quello di fornire un metodo per vedere se i dati cambiano nel tempo o per confrontare due valori senza dover utilizzare i valori effettivi. In entrambi i casi, è necessario confrontare i valori hash calcolati, il che si rivela particolarmente facile se entrambi sono stati memorizzati sotto forma di stringhe esadecimali (come illustrato nell'ultimo passaggio della procedura descritta nella sezione precedente). È tuttavia possibile che entrambi i valori siano espressi sotto forma di matrici di byte. Il codice seguente, che è il seguito del codice creato nella sezione precedente, illustra come confrontare due matrici di byte.
  1. Immediatamente al di sotto della creazione di una stringa esadecimale, creare un nuovo valore hash basato su nuovi dati di origine.
    sSourceData = "NotMySourceData"
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)
    
    Dim tmpNewHash() As Byte
    Dim bEqual As Boolean = False
    tmpNewHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
    					
  2. Il metodo più immediato per confrontare due matrici di byte consiste nell'eseguire un ciclo tra le matrici confrontando ogni singolo elemento con la relativa controparte del secondo valore. Se tutti gli elementi sono diversi o se due matrici non hanno la stessa dimensione, i due valori non saranno uguali.
    If tmpNewHash.Length = tmpHash.Length Then
        Dim i As Integer
        Do While (i < tmpNewHash.Length) AndAlso (tmpNewHash(i) = tmpHash(i))
            i += 1
        Loop
        If i = tmpNewHash.Length Then
            bEqual = True
        End If
    End If
    
    If bEqual Then
        Console.WriteLine("The two hash values are the same")
    Else
        Console.WriteLine("The two hash values are not the same")
    End If
    Console.ReadLine()
    					
  3. Salvare e quindi eseguire il progetto per visualizzare la stringa esadecimale creata dal primo valore hash e scoprire se il nuovo valore hash è uguale all'originale.

Elenco completo del codice

Imports System
Imports System.Security
Imports System.Security.Cryptography
Imports System.Text

Module Module1

    Sub Main()
        Dim sSourceData As String
        Dim tmpSource() As Byte
        Dim tmpHash() As Byte
        sSourceData = "MySourceData"
        'Create a byte array from source data.
        tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)

        'Compute hash based on source data.
        tmpHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
        Console.WriteLine(ByteArrayToString(tmpHash))

        sSourceData = "NotMySourceData"
        tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData)

        Dim tmpNewHash() As Byte
        Dim bEqual As Boolean = False
        tmpNewHash = New MD5CryptoServiceProvider().ComputeHash(tmpSource)

        If tmpNewHash.Length = tmpHash.Length Then
            Dim i As Integer
            Do While (i < tmpNewHash.Length) AndAlso (tmpNewHash(i) = tmpHash(i))
                i += 1
            Loop
            If i = tmpNewHash.Length Then
                bEqual = True
            End If
        End If

        If bEqual Then
            Console.WriteLine("The two hash values are the same")
        Else
            Console.WriteLine("The two hash values are not the same")
        End If
        Console.ReadLine()
    End Sub


    Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
        Dim i As Integer
        Dim sOutput As New StringBuilder(arrInput.Length)
        For i = 0 To arrInput.Length - 1
            sOutput.Append(arrInput(i).ToString("X2"))
        Next
        Return sOutput.ToString()
    End Function
End Module
				

Riferimenti

Per ulteriori informazioni sull'utilizzo delle funzioni di crittografia di Microsoft .NET Framework e sulla crittografia in generale, visitare i collegamenti seguenti:

Proprietà

Identificativo articolo: 301053 - Ultima modifica: sabato 12 maggio 2007 - Revisione: 4.3
Le informazioni in questo articolo si applicano a
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi: 
kbvs2005applies kbvs2005swept kbcrypt kbsecurity kbhowtomaster KB301053
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com