繁体   English   中英

将 HMAC 从 C# 复制到 Python

[英]Replicating HMAC from C# to Python

我正在使用由客户提供的 API,该客户提供了有关通过 C# 进行授权的示例代码,但我的公司使用 Python。 他们通过 HMAC 进行授权,并按照他们的示例代码(在 .net fiddle 上),我终于达到了我们的字节密钥和字节消息与 C# 调用相匹配的地步。

然而,当我们在他们的代码中得到这个时:

using (HMACSHA256 sha = new HMACSHA256(secretKeyByteArray))
    {
        // Sign the request
        byte[] signatureBytes = sha.ComputeHash(signature);

我们的等价物在哪里

signature_hmac = hmac.new(
    base64.b64decode(secretKey),
    bytes(message, "utf8"),
    digestmod=hashlib.sha256,
)

他们的signatureBytes的字节值与我们的signature_hmac.digest()的字节值不匹配。 如果使用相同的哈希库,并且输入的字节值匹配,我们应该得到相同的结果,对吧?

为了确保,当我说字节值匹配时, base64.b64decode(secretKey) (Python) 的值匹配var secretKeyByteArray = Convert.FromBase64String(secretKey); (C#)。

为我工作,确保您的输入数组在两者上完全相同。 我认为您可能缺少 base64 解码或以不同方式编码字符串。

这是我的 2 个测试:

secretKey = "wxyz".encode()
message = "abcd".encode()
signature_hmac = hmac.new(
    secretKey,
    message,
    digestmod=hashlib.sha256,
)
x = signature_hmac.hexdigest()

和 C#

byte[] signatureBytes;
byte[] secretKeyByteArray = Encoding.UTF8.GetBytes("wxyz");
byte[] signature = Encoding.UTF8.GetBytes("abcd");
using (HMACSHA256 sha = new HMACSHA256(secretKeyByteArray))
{
    signatureBytes = sha.ComputeHash(signature);
};

string x = Convert.ToHexString(signatureBytes);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM