BG personal blog Approfondimenti tecnici sul mondo informatico – By Gabriele Besta

6nov/082

VB.NET – una funzione che genera il valore di hash MD5 e SHA-1 di un qualunque file

E' ormai risaputo che il web offre uno sconfinato mondo di possibilità ma che allo stesso tempo racchiude innumerevoli minacce di ogni sorta. Virus, Spyware, Trojan, Adware, spopolano sulla rete e spesso sfruttano la celebrità di software distribuiti gratuitamente per insinuarsi nei nostri computer. Un caso emblematico è sicuramente il famosissimo software di peer-to-peer eMule clonato in decine di versioni, spesso difficilmente distinguibili dall'originale, ma che incorporano ogni genere di minaccia (a tal proposito vi ricordo che il vero e originale eMule è scaricabile in modo del tutto gratuito dal sito ufficiale www.emule-project.net). Pensate se inavvertitamente doveste installare un dialer illegale sul vostro computer, vi lascio immaginare le conseguenze sulla bolletta telefonica... Al fine di tutelare i propri utenti gli sviluppatori, sempre più spesso, assieme al download del loro software forniscono il valore di hash, ovvero "l'impronta digitale" del programma, che consente di verificarne l'integrità. Oltretutto verificare il file prima di procedere all'installazione, in particolare nel caso di file di grossi dimensioni come ad esempio distribuzioni linux, permette di evitare problematiche dovute ad errori nella trasmissione dei dati.

Capita l'importanza di questa prassi vi propongo una semplice funzione che permette di generare il valore di hash MD5 o SHA-1 di un qualunque file. Come sempre il codice è ampiamente commentato ma non esitate a postare dubbi o richieste di chiarimento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'Importo i Namespace necessari
Imports System.IO
Imports System.Security.Cryptography
Imports System.Text
 
    Public Function genera_hash(ByVal file_path As String, _
                                ByVal tipo_hash As String) As String
        Dim buffer() As Byte = Nothing
        'Imposto il path del file di cui voglio
        'genera il valore di has e la modalità
        'di apertura in solo lettura
        Dim file As New FileStream(file_path, _
                                   FileMode.Open, _
                                   FileAccess.Read, _
                                   FileShare.Read, 8192)
 
        If tipo_hash = "md5" Then
            'genera il valore hash md5
            Dim md5 As New MD5CryptoServiceProvider()
            md5.ComputeHash(file)
            buffer = md5.Hash
        ElseIf tipo_hash = "sha1" Then
            'genera il valore hash SHA-1
            Dim sha1 As New SHA1CryptoServiceProvider()
            sha1.ComputeHash(file)
            buffer = sha1.Hash
        End If
 
        'ricordarsi di chiudere lo stream del file
        file.Close()
 
        'converto l'hash del file in una stringa
        Dim hash As New StringBuilder(buffer.Length)
        For i As Integer = 0 To buffer.Length - 1
            hash.Append(buffer(i).ToString("X2"))
        Next
 
        'la funziona ritorna l'hash del file in formato
        'stringa tutta minuscola
        Return hash.ToString.ToLower
    End Function
 
'Esempio di utilizzo della funzione, è necessario
'specifare 2 parametri:
'1 il path del file di cui voglio generare il valore di hash
'2 il tipo di hash: md5 o sha1
'la funzione restitutisce una stringa di testo che
'in questo caso mostro in un msgbox
MsgBox(genera_hash("C:\file_qualunque.txt", "md5"))
Stampa
Commenti (2) Trackback (0)
  1. Salve a tutti
    commento su il codice: Bellissimo mi sono interessato e sono riuscito a fare un programma favoloso ma adesso vorrei sapere se potete postare anche un topic in cui si spiega come decriptare cioè da md5\sha1 a testo\numer\etc.
    Grazie mille

    • Ciao LittleHacker, mi dispiace deluderti ma MD5 e SHA-1 sono algoritmi di hash, ovvero generano un message digest (impronta del messaggio) di lunghezza fissa partendo da un messaggio di lunghezza variabile. Tuttavia queste funzioni non sono reversibili, quindi non è possibile “decifrare” il messaggio. Un’applicazione tipica di questi algoritmi è la memorizzazione delle password degli utenti in un database: l’amministratore memorizza la password cifrata, quando l’utente inserisce la sua password questa viene cifrata e confrontata con quella memorizzata nel database; se le due stringhe coincidono l’utente viene autenticato. Attraverso questo sistema l’amministratore non può risalire alle password degli utenti. Per quanto riguarda la tua richiesta dovresti approfondire la classe Rijndael offerta sempre dal namespace System.Security.Cryptography. Magari appena avrò un po’ di tempo gli dedicherò un post con qualche esempio pratico… Ciao


Lascia un commento


Ancora nessun trackback.