为什么我创建的这个 HMAC SHA256 哈希使用了错误的字符编码?
Why is this HMAC SHA256 hash I'm creating using the wrong character encoding?
我在 C# 中执行此操作以创建哈希:
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": ""
}
}
我明白了:
sX��m��.-��n��0��v@��i!S��IEC,��56
我希望哈希看起来像这样:
960aff6c335a87e6077f41066358980a88db54062505875e5a8c363ded9d027e
如果我像这样进行散列:
using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
{
return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message)));
}
我也一样。我如何 return 我所期待的?
我有什么不明白的?
无法将任意二进制数据转换为字符串...好像你想要BitConverter.ToString
, Convert.ToBase64String
or System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary
,而不是System.Text.Encoding.UTF8.GetString
已解决。我使用这个字符串扩展方法,所以要获得字符串的小写 HMAC SHA 256 哈希,我可以这样做:
我的消息.HmacSha256Digest(我的秘密)
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();
}
我在 C# 中执行此操作以创建哈希:
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": ""
}
}
我明白了:
sX��m��.-��n��0��v@��i!S��IEC,��56
我希望哈希看起来像这样:
960aff6c335a87e6077f41066358980a88db54062505875e5a8c363ded9d027e
如果我像这样进行散列:
using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
{
return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message)));
}
我也一样。我如何 return 我所期待的?
我有什么不明白的?
无法将任意二进制数据转换为字符串...好像你想要BitConverter.ToString
, Convert.ToBase64String
or System.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary
,而不是System.Text.Encoding.UTF8.GetString
已解决。我使用这个字符串扩展方法,所以要获得字符串的小写 HMAC SHA 256 哈希,我可以这样做:
我的消息.HmacSha256Digest(我的秘密)
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();
}