O functie hash este o procedura bine definita sau o functie matematica ce converteste o cantitate de date de dimensiuni varibile intr-o secventa de date de dimensiuni mici, de obicei de dimensiune fixa, care depinde de tipul algoritmului folosit si nu de cantitatea (lungimea) datelor de intrare.
O functie hash are (ar trebui sa aiba) urmatoarea proprietate: este imposibil de gasit, prin calcule, un alt bloc de date care sa aiba aceeasi valoare hash. Cu alte cuvinte, daca pentru un bloc se date dat calculam valoarea hash, este imposibila gasirea prin intermediul unui calcul a unui alt bloc a carui valoare hash sa fie aceeasi. Functiile hash sunt folosite in semnaturi digitale sau pentru verificarea integritatii datelor.
Valoarea hash are o lungime fixa indiferent de lungimea datelor pentru care a fist calculata. Valoarea hash a doua blocuri de date ar trebui sa fie identica daca cele doua blocuri de date sunt identice. Modificari minore in blocul de date duce la aparitia de modificari nepredictibile si importante in valoarea hash calculata.
O functie Hash nu este inversabila. Este imposibila reconstituirea satelor care au generau o anumita valoare hash.
.Net, in namespace-ul System.Security.Cryptography contine o serie de clase care implementeaza divesi algoritmi hash. HashAlgorithm este o clasa abstracta, folosita ca baza pentru diversi algoritmi de hash. In exemplul pe care vreau sa il prezint aici o sa folosesc 4 clase, derivate din HashAlgorithm care implementeaza 4 lgoritmi de criptare: SHA1, SHA256, SHA384, SHA512. Aceste clase sunt: SHA1Managed, SHA256Managed, SHA384Managed si SHA512Managed.
Pentru inceput am construit un enum, in care am introdus cei 4 algoritmi pe care il voi folosi, si cu ajutorul caruia userul va putea alege functia de hash dorita:
public enum HashAlgoritm { SHA1, SHA256, SHA384, SHA512 }
Aplicatia exemplu este o aplicatie winform, care contine 2 textbox-uri, un comboBox si un buton. Primul textbox va fi locul unde userul poate introduce un text pe care vrea sa il cripteze. Al doilea textbox va afisa stringul encriptat folosind algoritmul ales din comboBox. Operatia de criptare va avea loc la apasarea butonului. Form-ul e atat de simplu, incat nu o sa pun screenshot-uri sau codul care il defineste.
Functia care face criptarea este urmatoarea:
public static string ComputeHash(string textToHash, HashAlgoritm hashAlgorithm) { // plain text to a byte array. byte[] textToHashBytes = Encoding.UTF8.GetBytes(textToHash); HashAlgorithm hash; // Initialize the hashing algorithm class. switch (hashAlgorithm) { case HashAlgoritm.SHA1: hash = new SHA1Managed(); break; case HashAlgoritm.SHA256: hash = new SHA256Managed(); break; case HashAlgoritm.SHA384: hash = new SHA384Managed(); break; case HashAlgoritm.SHA512: hash = new SHA512Managed(); break; default: hash = new SHA1Managed(); break; } // Compute hash value for the text byte[] hashBytes = hash.ComputeHash(textToHashBytes); // Convert the result into a base64-encoded string. string hashValue = Convert.ToBase64String(hashBytes); // Return the result. return hashValue; }
Criptarea, asa cum se observa din cosul de mai sus, se aplica pe array de biti, motiv pentru care textul este “convertit” in byte[]. Deasemeni, rezultatul criptatii este tot un array de biti, care, pentru a fi reprezentat ca string se foloseste Convert.ToBase64String
Pingback/Trackback
Gravatar – o poza accesibila te tot Internet-ul | by zeltera
Jean Valjean says:
Cred ca ar fi fost util si ceva despre MD5 hash, foarte utilizat in ultima vreme.
zeltera says:
O sa scriu si despre asa ceva. Incet, incet…
Catalin says:
Interesant articolul .
…banuiesc ca ai vrut sa spui “datelor” aici : “reconstituirea satelor” :)
“System.Security.Cryptography contine o serie de clase care implementeaza divesi algoritmi hash… ”
m-am uitat la http://msdn.microsoft.com/en-us/library/system.security.cryptography.aspx
sa inteleg ca toti algoritmi de acolo sunt de tip hash … ?!
Andrei says:
Mi-a luat ceva timp sa-mi dau seama unde trebuie sa pun fiecare cod, dar pana la urma am reusit, uitandu-ma la cursurile din trecut.
Codul de la button1_click e acesta:
textBox2.Text=ComputeHash(textBox1.Text, (HashAlgoritm)Enum.Parse(typeof(HashAlgoritm), comboBox1.Text));
Mai greu mi-a fost cu convertirea din combobox in enum :).
Constantin says:
Eu am folosit private void button1_Click(object sender, EventArgs e)
{
switch (comboBox1.Text)
{
case “SHA1”:
textBox2.Text = ComputeHash(textBox1.Text, HashAlgoritm.SHA1);
break;
case “SHA256”:
textBox2.Text = ComputeHash(textBox1.Text, HashAlgoritm.SHA256);
break;
case “SHA384”:
textBox2.Text = ComputeHash(textBox1.Text, HashAlgoritm.SHA384);
break;
case “SHA512”:
textBox2.Text = ComputeHash(textBox1.Text, HashAlgoritm.SHA512);
break;
}