【问题标题】:Python hmac and C# hmacPython hmac 和 C# hmac
【发布时间】:2012-08-01 04:47:43
【问题描述】:

我们有一个 python 网络服务。它需要一个哈希作为参数。 python中的hash就是这样生成的。

    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));

但是,我得出了不同的结果。

我应该改变散列的顺序吗?

谢谢,

乔恩

【问题讨论】:

    标签: c# python sha1


    【解决方案1】:

    为了打印结果:

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

    这两个函数根本不做同样的事情。 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 2016-02-07
      • 2016-01-29
      • 2014-08-23
      • 1970-01-01
      • 2012-10-12
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多