关于C#:在.NET核心中使用sha-1

Using SHA-1 in .NET Core

当对dotnet核心中的字符串进行哈希处理时,会得到奇怪的结果。我发现了类似的问题:用ASP.NET核心计算sha1并发现了如何在.NET核心中将字节数组转换为字符串

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
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);
}

这是我的测试:

1
2
3
4
5
6
7
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));

输出:

???M?Hn??&???GS

enter image description here

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

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


我不知道"sha-1 online"是如何表示哈希的,但是因为它是哈希,所以它可以包含不能用(utf8)字符串表示的字符。我认为您最好使用Convert.ToBase64String()在字符串中轻松表示字节数组散列:

1
var hashString = Convert.ToBase64String(hash);

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

1
var bytes =  Convert.FromBase64String(hashString);

另请参见:将MD5哈希字节数组转换为字符串。它显示了在字符串中表示哈希的多种方法。例如,hash.ToString("X")将使用十六进制表示。

顺便说一下,这是对江户十一〔三〕的赞誉。-)


目前问题的解决方案:

1
2
3
4
5
6
var enc = Encoding.GetEncoding(0);

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