将SHA512输出转换为字符串时,“指定的值具有无效的控制字符”

时间:2014-02-26 18:15:13

标签: c# hash

我正在尝试为API创建一个Hash。 我的意见是这样的:

FBN |网络| 3QTC0001 | RS1 | 260214133217 | 000000131127897656

我的预期输出如下:

17361DU87HT56F0O9967E34FDFFDFG7UO334665324308667FDGJKD66F9888766DFKKJJR466634HH6566734JHJH34766734NMBBN463499876554234343432456

我试过了波纹管,但我一直在努力 “指定的值具有无效的控制字符。参数名称:值”

我实际上是在REST服务中执行此操作。

public static string GetHash(string text)
{
    string hash = "";
    SHA512 alg = SHA512.Create();
    byte[] result = alg.ComputeHash(Encoding.UTF8.GetBytes(text));
    hash = Encoding.UTF8.GetString(result);        
    return hash;
}

我错过了什么?

3 个答案:

答案 0 :(得分:3)

问题是Encoding.UTF8.GetString(result)因为result中的数据无效 UTF-8(它只是二进制粘贴!)所以尝试将其转换为文本无效 - 在一般,特别是对于此输入 - 这会导致抛出异常。

相反,将byte[]转换为所述字节序列的十六进制表示; 将其视为UTF-8编码文本。

查看问题How do you convert Byte Array to Hexadecimal String, and vice versa?How can I convert a hex string to a byte array?,其中讨论了实现此任务的几种不同方法。

答案 1 :(得分:2)

为了完成这项工作,您需要将单个byte元素转换为十六进制表示

var builder = new StringBuilder();
foreach(var b in result) {
  builder.AppendFormat("{0:X2}", b);
}
return builder.ToString();

答案 2 :(得分:1)

您可能需要考虑使用Base64编码(AKA UUEncode):

public static string GetHash(string text)
{
    SHA512 alg = SHA512.Create();
    byte[] result = alg.ComputeHash(Encoding.UTF8.GetBytes(text));
    return Convert.ToBase64String(result);
}

对于您的示例字符串,结果为

OJgzW5JdC1IMdVfC0dH98J8tIIlbUgkNtZLmOZsjg9H0wRmwd02tT0Bh/uTOw/Zs+sgaImQD3hh0MlzVbqWXZg==

它的优点是比将每个字节编码为两个字符更紧凑:三个字节采用Base64编码四个字符或另一个采用六个字符。