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

Per la versione di questo articolo relativa a Microsoft Visual C# .NET, vedere
307020 .

CONTENUTO DELL'ATTIVITÀ

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à

ID articolo: 301053 - Ultima revisione: 12 mag 2007 - Revisione: 1

Feedback