Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 349
JP Hellemons Avatar asked Nov 16 '25 23:11

JP Hellemons


2 Answers

Solution to the issue so far:

var enc = Encoding.GetEncoding(0);

byte[] buffer = enc.GetBytes(text);
var sha1 = SHA1.Create();
var hash = BitConverter.ToString(sha1.ComputeHash(buffer)).Replace("-","");
return hash;
like image 78
Victor Perez Avatar answered Nov 18 '25 12:11

Victor Perez


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. :-)

like image 30
Henk Mollema Avatar answered Nov 18 '25 12:11

Henk Mollema



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!