我正在尝试为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;
}
我错过了什么?
答案 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编码四个字符或另一个采用六个字符。