JP Hellemons JP Hellemons - 17 days ago 8
C# Question

Using SHA-1 in .NET Core

I get strange results when hashing a string in dotnet core
I have found this similar question: Computing SHA1 with ASP.NET Core
and have found how to convert a byte array to string in .net core

this is my code:

private static string CalculateSha1(string text)
{
var enc = Encoding.GetEncoding(65001); // utf-8 code page
byte[] buffer = enc.GetBytes(text);

var sha1 = System.Security.Cryptography.SHA1.Create();

var hash = sha1.ComputeHash(buffer);

return enc.GetString(hash);
}


and this is my test:

string test = "broodjepoep"; // forgive me

string shouldBe = "b2bc870e4ddf0e15486effd19026def2c8a54753"; // according to http://www.sha1-online.com/

string wouldBe = CalculateSha1(test);

System.Diagnostics.Debug.Assert(shouldBe.Equals(wouldBe));


output:


���M�Hn�ѐ&��ȥGS


enter image description here

I have the nuget package
System.Security.Cryptography.Algorithms
installed (v 4.3.0)

Also tried with
GetEncoding(0)
to get the sys default coding. Also did not work.

Answer

I'm not sure how 'SHA-1 Online' represents your hash, buts since it's a hash, it can contain characters that can't be represented in a (UTF8) string. I think you're better off using Convert.ToBase64String() to easily represent the byte-array hash in a string:

var hashString = Convert.ToBase64String(hash);

To convert it back to a byte-array, use Convert.FromBase64String():

var bytes =  Convert.FromBase64String(hashString);

Also see: Converting a md5 hash byte array to a string. Which shows there a multiple ways to represent hash in a string. For example, hash.ToString("X") will use a hexadecimal representation.

Kudos for broodjepoep, by the way. :-)