为什么我使用错误的字符编码创建HMAC SHA256哈希?
问题描述:
我在C#这样做是为了创建一个哈希:为什么我使用错误的字符编码创建HMAC SHA256哈希?
using (var hmacsha256 = new HMACSHA256(Encoding.ASCII.GetBytes(secret)))
{
return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.ASCII.GetBytes(message)));
}
我用下面的JSON:
{
"client_id": "26075235",
"client_version": "1.0.0",
"event": "app.uninstall",
"timestamp": "1478741247",
"data": {
"user_id": "62581379",
"site_id": "837771289247593785",
"domain": ""
}
}
,我得到这个:
sXm.- !n0v @我SIEC,56
我期待哈希看起来像这样:
960aff6c335a87e6077f41066358980a88db54062505875e5a8c363ded9d027e
如果我喜欢这个散列:
using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
{
return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message)));
}
我得到同样的事情。我如何回报我期待的?
我对此不甚了解?
答
任意的二进制数据不能转换为字符串...好像你想BitConverter.ToString
,Convert.ToBase64String
或System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary
,而不是System.Text.Encoding.UTF8.GetString
答
现在解决了。我用这个字符串扩展方法,因此要获得一个小写HMAC SHA 256哈希为一个字符串,我可以这样做:
mymessage.HmacSha256Digest(mysecret)
public static string HmacSha256Digest(this string message, string secret)
{
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] keyBytes = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
System.Security.Cryptography.HMACSHA256 cryptographer = new System.Security.Cryptography.HMACSHA256(keyBytes);
byte[] bytes = cryptographer.ComputeHash(messageBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
感谢,但是BitConverter.ToString给我73 -58-EE-6D-81-2E-15-1D-14-2D-8F-6E-F1-30-85-76-40-D3-69-14-21-53-A6-D7-49-45 -43-2C-D8-35-13-36。任何想法? – Izzy
@Izzy想法是什么?你现在的新问题是什么? –
谢谢LB - 我的哈希消息是不正确的,它扔我。当我现在散列正确的消息,并删除' - ',它的作品 - 看到我的答案一个相当干净的方式来散列消息 – Izzy