C#HMACSHA256给出了与PHP hash_hmac不同的结果



我在php中有以下代码:演示

function generateHash($hashSecret,$postData) {
ksort($postData);
$message="";
$appendAmp=0;
foreach($postData as $key => $value) {
if (strlen($value) > 0) {
if ($appendAmp == 0) {
$message .= $key . '=' . $value;
$appendAmp = 1;
} else {
$message .= '&' . $key . "=" . $value;
}
}
}
$secret = pack('H*', $hashSecret);
return hash_hmac('sha256', $message, $secret);
}
$postData = array(
"cardNum" =>  "5123456789012346",
"cardExp" =>  2105,
"cardCVC" =>  123,
"holderName" => "John Doe",
"mobileNumber" => "20100000000000"
);
$secureHash= 'C0DF9A7B3819968807A9D4E48D0E65C6';
$hashSecret = generateHash($secureHash,$postData);
echo $hashSecret;

//输出6975f8f502e597272a6d8760cc558e7867f36a312a5d336c4ba983dcfb81691//以及c#中的以下演示

public static void Main()
{
Console.Write(CreateToken("cardCVC=123&cardExp=2105&cardNum=5123456789012346&holderName=John Doe&mobileNumber=20100000000000","C0DF9A7B3819968807A9D4E48D0E65C6"));
}
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).Replace("-","");
}
}

//输出:26FFE252951304F96D444CB69210657B44E837B7C8E8947C667B344594F18演示我需要修改我的c#代码以匹配从php生成的值

更新:我已经尝试了在线sha生成器,它给了我的c#结果

经过多次尝试,我发现PHP包('H*',$hashSecret(使结果不同,所以我添加了以下方法:

public static byte[] Pack(string key)
{
key = key.Replace("-", "");
byte[] raw = new byte[key.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(key.Substring(i * 2, 2), 16);
}
return raw;
}

相关内容

  • 没有找到相关文章

最新更新