【问题标题】:C# vs PHP - They return different HMACSHA256C# vs PHP - 他们返回不同的 HMACSHA256
【发布时间】:2014-03-04 15:14:39
【问题描述】:

这是我的 PHP 代码:

<?php
    $sig_string = "GET&https%3A%2F%2Fapi.pinterest.com%2Fv3%2Fusers%2Farchimede%2Fboards%2F&client_id=987654&timestamp=1391761866";
    $secret = "123456";
    $sig = hash_hmac("sha256", $sig_string, $secret);
    echo $sig;
?>

返回(正确)a7918aec50919915f3cefed8622ddbe35448c8f71a54ad115828f07a05930f4c

现在,我想在 C# 中翻译这个函数。代码:

signature_base_string = "GET&https%3A%2F%2Fapi.pinterest.com%2Fv3%2Fusers%2Farchimede%2Fboards%2F&client_id=987654&timestamp=1391761866";
signing_key = "123456";
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(signing_key);
byte[] messageBytes = encoding.GetBytes(signature_base_string);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
    Response.Write(Convert.ToBase64String(hashmessage));
}

但它会返回p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=

为什么会有两个不同的结果? C# 代码有什么问题?

【问题讨论】:

    标签: c# php .net hash hmac


    【解决方案1】:

    PHP 将结果编码为十六进制,而 c# 将结果编码为 base64。但都是一样的。

    改变这一行:

    Response.Write(Convert.ToBase64String(hashmessage));
    

    到这里:

    Response.Write(BitConverter.ToString(hashmessage).Replace("-", "").ToLower());
    

    以十六进制编码获得结果。

    【讨论】:

      【解决方案2】:

      它们是一样的:

      .NET C# 的结果是p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=。这是一个 base64 字符串。

      例如,您可以使用this tool 将其转换为十六进制。并且转换后你会得到和 PHP 一样的结果:

      A7918AEC50919915F3CEFED8622DDBE35448C8F71A54AD115828F07A05930F4C

      【讨论】:

      • 那么,我怎样才能转换成十六进制呢?
      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2015-04-24
      • 2011-03-03
      • 1970-01-01
      • 2018-03-04
      • 2019-10-23
      相关资源
      最近更新 更多