HMAC的Python和C#HMAC(Python hmac and C# hmac)

2019-06-26 17:49发布

我们有一个Python Web服务。 它需要一个哈希作为参数。 在Python中的哈希生成这个样子。

    hashed_data = hmac.new("ant", "bat", hashlib.sha1)
    print hashed_data.hexdigest()

现在,我这是怎么生成C#的哈希值。

    ASCIIEncoding encoder = new ASCIIEncoding();
    Byte[] code = encoder.GetBytes("ant");
    HMACSHA1 hmSha1 = new HMACSHA1(code);
    Byte[] hashMe = encoder.GetBytes("bat");
    Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
    Console.WriteLine(Convert.ToBase64String(hmBytes));

不过,我会说出不同的结果。

我应该改变了哈希的顺序?

谢谢,

乔恩

Answer 1:

为了打印结果:

  • 在Python你使用: .hexdigest()
  • 在C#中使用: Convert.ToBase64String

这些2个职能不这样做同样的事情在所有。 Python的hexdigest简单地转换字节数组十六进制字符串而C#方法使用Base64编码的字节数组转换。 因此,要获得相同的输出简单地定义一个函数:

public static string ToHexString(byte[] array)
{
    StringBuilder hex = new StringBuilder(array.Length * 2);
    foreach (byte b in array)
    {
        hex.AppendFormat("{0:x2}", b);
    }
    return hex.ToString();
}

然后:

ASCIIEncoding encoder = new ASCIIEncoding();
Byte[] code = encoder.GetBytes("ant");
HMACSHA1 hmSha1 = new HMACSHA1(code);
Byte[] hashMe = encoder.GetBytes("bat");
Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
Console.WriteLine(ToHexString(hmBytes));

现在,您将得到相同的输出在Python:

739ebc1e3600d5be6e9fa875bd0a572d6aee9266


文章来源: Python hmac and C# hmac
标签: c# python sha1