La mia reputazione sta colando a picco, dopo il mio
breve racconto sul byte innamorato. Mi devo riprendere subito, ed alla
svelta, anche! Riprendo quindi la mia serie di post sull'esame 70-536
continuando il discorso sulle classi di crittografia messe a disposizione da
.NET. Nell'ultimo post avevo fatto vedere qualche riga di
codice per utilizzare la classe HashAlgorithm allo scopo di generare
l'hash value di una stringa, secondo diversi provider (SHA256, SHA384, SHA512,
etc.).
Giusto per fare qualche test, ho scritto una piccola applicazione che prende
in input una stringa da una TextBox, ne calcola l'hash con i vari provider .NET,
e ne visualizza l'output su un'altra TextBox. L'interfaccia è molto semplice e
spartana. Prima di parlare dell'interfaccia in sè, voglio farvi vedere la classe
HashString, così come era stata scritta l'ultima volta, e come
la useremo oggi.
public class HashString
{
public static byte[] HashStringa(string contents, string shaMethod)
{
HashAlgorithm algo = HashAlgorithm.Create(shaMethod);
// converto la stringa in byte[]
byte[] buffer = Encoding.Unicode.GetBytes(contents);
// calcolo l'hash
byte[] hash = algo.ComputeHash(buffer);
// ritorno il byte[] che contiene l'hash
return (hash);
}
}
Il metodo statico HashStringa accetta due parametri:
la stringa contents di cui calcolare l'hash ed un'altra stringa
shaMethod che contiene il nome della classe da usare per calcolare
l'hash value. La variabile shaMethod viene passata al costruttore
statico Create della classe HashAlgorithm. Il
metodo, infine, ritorna un byte[] contenente l'hash value: da notare che la
lunghezza di questo array varia a seconda del tipo di hash che abbiamo
calcolato. Maggiori dettagli li trovate nel mio post precedente.
L'interfaccia comprende un solo Windows Form, con i seguenti oggetti:
- una TextBox txtInput
- una TextBox txtOutput
- una ComboBox cmbHashMethod
- un Buttom btnGet
La ComboBox viene inizializzata durante il Load della WF, con il seguente
codice:
private void FormMain_Load(object sender, EventArgs e)
{
string[] hashes = { "SHA1", "SHA256", "SHA384", "SHA512", "MD5" };
this.cmbHashMethod.DataSource = hashes;
}
Dichiaro un array, ed usando un semplice data-binding popolo la ComboBox.
L'altro evento che ho gestito è il Click del Button, per sfruttare la classe
HashString indicata prima:
private void btnGet_Click(object sender, EventArgs e)
{
if (this.txtInput.Text == string.Empty) return;
if (this.cmbHashMethod.SelectedItem == null) return;
string sha = (string)this.cmbHashMethod.SelectedItem;
System.Text.Encoding enc = System.Text.Encoding.UTF8;
byte[] ret = HashString.HashStringa(this.txtInput.Text, sha);
this.txtOutput.Text = enc.GetString(ret);
}
Innanzitutto, controllo che l'utente abbia scritto qualcosa in txtInput e che
abbia selezionato una classe nella cmbHashMethod. Calcolo l'hash e ne visualizzo
il valore in txtOutput. Ho utilizzato la classe Encoding per
trasformare un byte[] in una stringa in chiaro.
A cosa serve calcolare l'hash di un oggetto?
Alcuni via
e-mail, o tramite la Contact Form del mio blog, mi hanno chiesto lo scopo di calcolare un
hash value se non posso tornare indietro al contenuto iniziale.
Attenzione: stiamo parlando di cose
diverse! L'hash value serve ad esempio per verificare che
il risultato di una trasmissione sia avvenuto correttamente. Mi spiego meglio.
Supponiamo di avere un server Web con su Linux, e di mettere a disposizione su
questo server il documento Migrate_To_Windows.pdf. Supponiamo che
l'hash value di questo file sia un certo valore xyz. Ora, voi con IE
navigate su quel sito, scaricate il documento e provate a controllare l'hash
value del file. Se ottenete xyz, siete molto ragionevolmente sicuri che
il documento scaricato è identico all'originale. Se ottenete un valore diverso
da xyz, allora qualcosa non è andato bene ed i due documenti sono
diversi. Ricordate infatti che è sufficiente anche una piccola differenza, per
avere un hash value completamente diverso.
Oppure, ancora, lo spiega molto bene anche Alessio in questo post. Per evitare di memorizzare una password in
plaintext, ne viene memorizzato soltanto il suo hash value,
che poi verrà confrontato con l'hash value calcolato dalla password inserita
dall'utente in fase di login.
Quello che mi avete chiesto via e-mail è la vera e propria crittografia,
ovvero: prendere un messaggio, criptarlo con una chiave privata, ottenere un
messaggio codificato e trasmettere quello. Il ricevente potrà decodificare
il messaggio con la chiave pubblica e risalire di conseguenza al messaggio
originario. Questo sarà il tema dei miei prossimi post, considerando che
preferisco non scendere troppo nella teoria (non ne sarei in grado, e
soprattutto c'è qualcun altro che lo fa meglio di me ), ma vedere esempi pratici direttamente con
le classi esposte dal FX2.0. Alla prossima, allora!