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")) |





agosto 30th, 2009 - 04:34
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
agosto 30th, 2009 - 04:38
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