在.NET Core中使用SHA-1

时间:2016-11-22 11:38:50

标签: c# cryptography asp.net-core .net-core sha1

在dotnet核心中散列字符串时,我得到奇怪的结果 我发现了类似的问题:Computing SHA1 with ASP.NET Core 并找到了.net核心convert a byte array to string的方法

这是我的代码:

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);
}

这是我的测试:

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));

输出:

  

MHnѐ&安培;ȥGS

enter image description here

我安装了nuget包System.Security.Cryptography.Algorithms(v 4.3.0)

还尝试使用GetEncoding(0)来获取sys默认编码。也没用。

2 个答案:

答案 0 :(得分:5)

我不确定'SHA-1 Online'如何表示你的哈希值,但因为它是一个哈希值,它可以包含无法用(UTF8)字符串表示的字符。我认为你最好使用Convert.ToBase64String()来轻松地在字符串中表示字节数组哈希:

var hashString = Convert.ToBase64String(hash);

要将其转换回字节数组,请使用Convert.FromBase64String()

var bytes =  Convert.FromBase64String(hashString);

另见:Converting a md5 hash byte array to a string。这表明有多种方法可以表示字符串中的哈希值。例如,hash.ToString("X")将使用十六进制表示。

顺便说一句broodjepoep的荣誉。 : - )

答案 1 :(得分:3)

到目前为止解决问题的方法:

var enc = Encoding.GetEncoding(0);

byte[] buffer = enc.GetBytes(text);
var sha1 = SHA1.Create();
var hash = BitConverter.ToString(sha1.ComputeHash(buffer)).Replace("-","");
return hash;