这如何允许我们使用加密函数进行散列?

时间:2017-10-04 12:07:14

标签: c# encryption

我看到了这段代码 github

public static string CalculateSignature(string text, string secretKey)
{
    using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
    {
        hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text));
        return string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2")).ToArray()); // minimalistic hex-encoding and lower case
    }
}

这段代码有什么作用?

string.Concat(hmacsha512.Hash.Select(b => b.ToString("x2"))

据我所知,你无法将字符串传递给tostring()方法。

为什么需要选择?

代码可以简化吗?为什么再次toarray()然后又concat

特别是我不知道b.ToString("x2")做了什么。我很惊讶它甚至编译。 https://msdn.microsoft.com/en-us/library/system.object.tostring(v=vs.110).aspx说tostring方法没有参数。

然后为什么我需要那个选择的东西。编码器试图完成的是什么。

所以我们得到了一堆字节数组,然后我们使用computeHash来获取一堆字节数组。然后我们重新编码为字符串。这是基本的想法。

那么为什么将文本转换为字节非常快Encoding.UTF8.GetBytes(text)然而我们却做了一些奇怪的事情将这些文本转换为字符串

1 个答案:

答案 0 :(得分:1)

  

特别是我不知道b.ToString(“x2”)做了什么。我很惊讶它甚至符合

请参阅https://msdn.microsoft.com/en-us/library/y11056e9(v=vs.110).aspxhttps://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings。它将一个字节格式化为两个字符的小写十六进制字符串。 0x03 => “03”,0x0A => “0A”。

  

为什么需要选择?

Select将一个可枚举转换为另一个。由于哈希是byte[] IEnumerable<byte>,所以这会将每个byte转换为表达式内部评估的值。因此,每个字节成为两个字符的十六进制字符串。

  

为什么toarray()然后再连续?

在.NET Framework 1.0 / 1.1中添加了

String.Concat(string[])。在.NET Framework 4.0中添加了String.Concat(IEnumerable<string>)。如果这段代码是针对.NET 3.5编写的,那么它就是“最佳”(没有通过更有效的StringBuilder方法写入)。

  

编码员试图完成什么。

你运过它了吗?它生成一个十六进制字符串,表示密钥下数据的HMAC-SHA-2-512。

  

我很惊讶它甚至符合

它只使用C#3.0中的语法(它使用的最新内容是lambda expressions。C#3.0下个月将变为10年。(它随.NET Framework 3.5发布)

  

代码可以简化吗?

不确定

public static string CalculateSignature(string text, string secretKey)
{
    using (var hmacsha512 = new HMACSHA512(Encoding.UTF8.GetBytes(secretKey)))
    {
        byte[] hmac = hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(text));
        StringBuilder builder = new StringBuilder(hmac.Length * 2);

        foreach (byte b in hmac)
        {
            builder.Append(b.ToString("x2"));
        }

        return builder.ToString();
    }
}

嗯,那性能更好。也许它不是“更简单”,取决于你的定义。