4

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.

3
  • 2
    A bit off-topic, but SHA-1 is being deprecated (see e.g. blog.qualys.com/ssllabs/2014/09/09/… and blogs.windows.com/msedgedev/2016/04/29/sha1-deprecation-roadmap, among others). If you need strong crypto, you should move away from SHA-1. Commented Nov 25, 2016 at 15:00
  • I know, but please tell that to the external service that I am using ;-) (Dutch bank) Commented Nov 28, 2016 at 9:23
  • The static SHA512 class is supported in both .NET Core and .NET Framework. Go with it. Commented Apr 1, 2019 at 11:46

2 Answers 2

9

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;
Sign up to request clarification or add additional context in comments.

1 Comment

Solution to the issue so far? @Henk Mollema answered this 22 nov 2016.
8

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

2 Comments

@JPHellemons I don't know what method 'SHA-1 Online' uses to convert the hash to a string, might be something else. It doesn't matter though, as long as the application know which format it is.
@JPHellemons: did you try hash.ToString("X")?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.