为什么这个HMAC SHA256哈希我使用错误的字符编码创建?

时间:2016-11-10 23:21:17

标签: c# encoding sha hmac

我在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": ""
    }
}

我得到了这个:

sXm.-n0v@i!SIEC,56

我希望哈希看起来像这样:

960aff6c335a87e6077f41066358980a88db54062505875e5a8c363ded9d027e

如果我像这样进行散列:

        using (var hmacsha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret)))
        {
            return System.Text.Encoding.UTF8.GetString(hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(message)));
        }

我得到同样的东西。如何归还我期待的内容?

我对此不了解什么?

2 个答案:

答案 0 :(得分:2)

现在解决了。我使用这个字符串扩展方法,所以为了得到一个字符串的小写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();
}

答案 1 :(得分:1)

无法将任意二进制数据转换为字符串...似乎您想要BitConverter.ToStringConvert.ToBase64StringSystem.Runtime.Remoting.Metadata.W3cXsd2001.SoapBase64Binary,而不是System.Text.Encoding.UTF8.GetString