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(由上面的代码转换)的输出应该是相等的字符串。
我想使用 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(由上面的代码转换)的输出应该是相等的字符串。