Cum pentru a calcula și valorile hash comparare utilizând Visual C#

Pentru o versiune Microsoft Visual Basic .NET a acestui articol, consultați
301053 .

Acest articol se referă la următoarele Microsoft .NET Framework Class Library spațiilor de nume:
  • System.Security.Cryptography
  • System.Text

ÎN ACEASTĂ ACTIVITATE

Rezumat

Acest articol pas cu pas vă arată cum se obține o valoare hash și cum se compară două valori hash pentru a verifica dacă sunt identice.

Clase System.Security.Cryptography în Microsoft .NET Framework simplifică pentru a calcula o valoare hash pentru datele sursă.

Cerințe

Lista următoare evidențiază hardware recomandate, software-ul, infrastructura de rețea și pachete service pack, care va fi necesar:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server sau Windows NT 4.0 Server
  • Microsoft Visual C# .NET sau Microsoft Visual C# 2005

Calcula o valoare Hash

Este ușor să genereze și comparați valorile hash folosind resursele criptografice conținute în spațiul de nume System.Security.Cryptography . Deoarece toate funcțiile hash ia intrare de tip Byte [], ar putea fi necesar să efectuați conversia sursă într-o matrice de octeți înainte de aceasta este hashed. Pentru a crea un hash pentru o valoare șir, urmați acești pași:
  1. Deschideți Visual Studio .NET sau Microsoft Visual Studio 2005.
  2. Creați o nouă aplicație consolă în Visual C# .NET sau Visual C# 2005 creează un public class pentru tine împreună cu o metodă Main() goală.

    Notă În Microsoft Visual C#. NET, Class1.cs se creează în mod implicit. În Microsoft Visual C# 2005, Program.cs se creează în mod implicit.
  3. Utilizează directivă utilizând spaţii de nume sistem, System.Security.Cryptography și System.Text , astfel încât nu sunt necesare pentru a beneficia de declarații de la aceste spaţii de nume mai târziu în codul. Aceste afirmații trebuie utilizată înainte de orice alte declarații.
    using System;using System.Security.Cryptography;
    using System.Text;

  4. Declară o variabilă string pentru a reține de sursa de date, și matrice doi octeți (de dimensiune nedefinită) pentru a reține sursă de octeți și valoarea hash rezultate.
    string sSourceData;byte[] tmpSource;
    byte[] tmpHash;

  5. Utilizați metoda GetBytes() , care este membru al clasei System.Text.ASCIIEncoding , pentru a efectua conversia şirul sursă într-o matrice de octeți (necesară ca intrare în funcția hash).
    sSourceData = "MySourceData";//Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

  6. Calcula MD5 hash pentru datele sursă apelând ComputeHash pe o instanță a clasei MD5CryptoServiceProvider . Rețineți că, pentru a calcula altă valoare hash, va trebui să creați o altă instanță a clasei.
    //Compute hash based on source data.tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

  7. Matrice de octeți tmpHash deţine acum valoarea calculată hash (128 de biți valoare = 16 bytes) pentru datele sursă. Deseori este util pentru a afișa sau stoca o valoare astfel ca un șir hexazecimal, care se realizează următorul cod:
    Console.WriteLine(ByteArrayToString(tmpHash));static string ByteArrayToString(byte[] arrInput)
    {
    int i;
    StringBuilder sOutput = new StringBuilder(arrInput.Length);
    for (i=0;i < arrInput.Length; i++)
    {
    sOutput.Append(arrInput[i].ToString("X2"));
    }
    return sOutput.ToString();
    }

  8. Salvați și apoi executa codul pentru a vedea rezultate șirul hexazecimal pentru valoarea sursă.

Comparați două valori Hash

Unul dintre scopuri de a crea un hash din sursa de date este de a furniza o modalitate pentru a vedea dacă datele s-a modificat în timp, sau pentru a compara două valori fără vreodată lucrul cu valorile reale. În ambele cazuri, trebuie să comparaţi două linii oblice calculată, care este mai ușor, dacă acestea sunt stocate atât ca șiruri hexazecimal (ca în ultimul pas din secțiunea de mai sus). Cu toate acestea, este posibil ca ambele acestea vor fi sub formă de matrice de octeți. Codul următor, care continuă de cod creat în secțiunea anterioară, arată cum se compară matrice doi octeți.
  1. Sub crearea de un șir hexazecimal, creați o nouă valoare hash bazate pe noua sursă de date.
    sSourceData = "NotMySourceData";tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

    byte[] tmpNewHash;

    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

  2. Cel mai simplu mod de a compara doi octeți matrice este ciclează prin matrice, comparativ cu fiecare element individuale omologul de la a doua valoare. Dacă orice elemente sunt diferite, sau dacă două matrice nu sunt aceeași dimensiune, cele două valori nu sunt egale.
    bool bEqual = false;if (tmpNewHash.Length == tmpHash.Length)
    {
    int i=0;
    while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
    {
    i += 1;
    }
    if (i == tmpNewHash.Length)
    {
    bEqual = true;
    }
    }

    if (bEqual)
    Console.WriteLine("The two hash values are the same");
    else
    Console.WriteLine("The two hash values are not the same");
    Console.ReadLine();

  3. Salvați și apoi executați proiectul pentru a vizualiza șirul hexazecimal creat la prima valoare hash și pentru a afla dacă hash nou este egală cu originalul.

Listă completă de cod

using System;using System.Security.Cryptography;
using System.Text;

namespace ComputeAHash_csharp
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
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);

byte[] tmpNewHash;

tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

bool bEqual = false;
if (tmpNewHash.Length == tmpHash.Length)
{
int i=0;
while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
{
i += 1;
}
if (i == tmpNewHash.Length)
{
bEqual = true;
}
}

if (bEqual)
Console.WriteLine("The two hash values are the same");
else
Console.WriteLine("The two hash values are not the same");
Console.ReadLine();
}

static string ByteArrayToString(byte[] arrInput)
{
int i;
StringBuilder sOutput = new StringBuilder(arrInput.Length);
for (i=0;i < arrInput.Length -1; i++)
{
sOutput.Append(arrInput[i].ToString("X2"));
}
return sOutput.ToString();
}
}
}

Referințe

Pentru mai multe informații despre cum se utilizează caracteristicile criptografice Microsoft .NET Framework și despre criptografie în general, vizitați următorul site Web:
"MD5 Message-Digest Algorithm"
http://theory.lcs.mit.edu/
 
Proprietăți

ID articol: 307020 - Ultima examinare: 23 feb. 2017 - Revizie: 1

Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2005

Feedback