webForumDet fria alternativet

Hashing

8 svar · 355 visningar · startad av Dino

DinoMedlem sedan sep. 20011 914 inlägg
#1

Funderar på om ComputeHash invändigt använder sig av den kod som Kod 1 innehåller, CryptoStream alltså, så att det är lika bra att använda kod 2. Någon som vet? Eller har rekommendationer rent allmänt.

//Kod 1
public string Hash(byte[] input)
{
   HashAlgorithm ha = SHA384.Create();
   using(CryptoStream cs = new CryptoStream(Stream.Null, ha, CryptoStreamMode.Write)) 
   {
      cs.Write(input, 0, input.Length);
      cs.FlushFinalBlock();
   }
   return  Convert.ToBase64String(ha.Hash));
}

//Kod 2
public string Hash(byte[] input)
{
   HashAlgorithm ha = SHA384.Create();
   return  Convert.ToBase64String(ha.ComputeHash(input)));
}
fredrikMedlem sedan dec. 19991 072 inlägg
#2

En liten kommentar bara....

...har du jämfört din hash med en "riktig" hash utförd av en algoritm som du vet fungerar?

Krypto-klasserna i .NET kan användas på massor av sätt och returnerar då olika värden, så det kan vara bra att jämföra med ett hash-värde man vet stämmer. Jag brukar kolla mot:
http://www.securitystats.com/tools/hashcalc.php

Tänk på att hash-värden först ska plockas ut som HEX-värden innan du gör BASE64 av dem.

DinoMedlem sedan sep. 20011 914 inlägg
#3

Ok, det var ju trevligt. Testade SeurityStats med "abcdef" med följande kod.

public string Hash(string input)
{
   byte[] b = Encoding.UTF8.GetBytes(input);
   HashAlgorithm ha = MD5.Create();
   return Convert.ToBase64String(ha.ComputeHash(b));
}

SeurityStats ger: E80B5017098950FC58AAD83C8C14978E
Min ger: 6AtQFwmJUPxYqtg8jBSXjg==

Är ju lite svårt att veta vad det är som gör skillnaden.

Tänk på att hash-värden först ska plockas ut som HEX-värden innan du gör BASE64 av dem.

Hur skulle det se ut?

fredrikMedlem sedan dec. 19991 072 inlägg
#4

Du hämtar ut ditt värde som BASE64. Enligt alogritmen ska värdet hämtas som HEX och inte BASE64.

Du får loopa igenom dina bytes och göra typ:
for each b in hashBytes
hash &= string.format("{0:X2}", b)
next

DinoMedlem sedan sep. 20011 914 inlägg
#5

fredrik skrev:

...Enligt alogritmen ska värdet hämtas som HEX och inte BASE64....

Har en method som hashar beroende på vilken hashalogritm man väljer så gäller samma sak för SHA varianterna.

fredrikMedlem sedan dec. 19991 072 inlägg
#6

Ja, fast jag tror att även MD5, SHA1 mfl. faktiskt ska returnera ett HEX-värde. Sen kan du BASE64.a detta värde.

(Annars får du bygga in logik för att BASE64.a vissa och HEX.a vissa)

En sak är dock säker: Lite inte på de kod-exempel i .NET som du hittar på nätet! 9/10 returnerar helt enkelt fel då de returner BASE64 från SHA1.

DinoMedlem sedan sep. 20011 914 inlägg
#7

Ok. nu vet jag inte om jag är allmänt dum. Men om jag har en sån här:

private static string BytesToHexString(byte[] input)
{
   StringBuilder sb = new StringBuilder(64);
   for(int i = 0; i < input.Length; i++)
   {
      sb.Append(String.Format("{0:x2}", input[i]));
   }
   return sb.ToString();
}

Skall jag då göra om denna string till bytes igen eftersom Convert.ToBase64String endast tar emot bytes.

fredrikMedlem sedan dec. 19991 072 inlägg
#8

Japp, och det gör du enkelt med typ:

return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sb.ToString())

Kom dock ihåg att om du ska jämföra med http://www.securitystats.com/tools/hashcalc.php så ska du jämföra värdet som HEX och inte BASE64.

DinoMedlem sedan sep. 20011 914 inlägg
#9

Ok, tack för tipsen.

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)