PHP 中的 HMAC sha256 不会 return 以十六进制和破折号 (-) 输出

HMAC sha256 in PHP does not return output in hex and with dash (-)

我想使用 hmac sha256 算法生成在 PHP 中计算的签名。输出应与 c# 相同,如下所示:

private static string CreateToken(string message, string secret)
{

      var encoding = new System.Text.UTF8Encoding();
      byte[] keyByte = encoding.GetBytes(secret);
      byte[] messageBytes = encoding.GetBytes(message);
      using (var hmacsha256 = new HMACSHA256(keyByte))
      {
        byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
        return BitConverter.ToString(hashmessage);
      }
}

输出:

26-FF-E2-E2-95-13-30-4F-96-D4-44-CB-69-21-06-57-B4-E4-4E-83-7B-7C-8E-89-47-C6-67-B3-44-59-4F-18

php 上哈希 hmac sha256 的输出格式与 c# 不完全相同。这是 php 的哈希 hmac sha256 示例:

string '07a932dd17adc59b49561f33980ec5254688a41f133b8a26e76c611073ade89b' (length=64)

你只需要将它转换成c#的格式

  • 每 2 个字符添加一个破折号
  • 转换为大写
$string = '07a932dd17adc59b49561f33980ec5254688a41f133b8a26e76c611073ade89b';
$string = strtoupper($string);
$arr = str_split($string, 2);
$string = implode("-", $arr);
var_dump($string);

输出:

string(95) "07-A9-32-DD-17-AD-C5-9B-49-56-1F-33-98-0E-C5-25-46-88-A4-1F-13-3B-8A-26-E7-6C-61-10-73-AD-E8-9B"

假设明文和秘密相同,c#和php(由上面的代码转换)的输出应该是相等的字符串。