简体   繁体   English

C# HMACSHA1 与 PHP hash_hmac

[英]C# HMACSHA1 vs PHP hash_hmac

I am trying to connect to an API to get an access token using PHP and the only hashing example code is written in C#.我正在尝试使用 PHP 连接到 API 以获取访问令牌,并且唯一的散列示例代码是用 C# 编写的。 This is the C# version:这是 C# 版本:

private static string GetHMACSignature(string privatekey, string message)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(privatekey);
            Console.WriteLine("Key: "+ToReadableByteArray(keyByte));

            System.Security.Cryptography.HMACSHA1 hmacsha1 = new System.Security.Cryptography.HMACSHA1(keyByte);
            byte[] messageBytes = encoding.GetBytes(message);
            Console.WriteLine("Message: "+ToReadableByteArray(messageBytes));
            byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
            Console.WriteLine("Hash: "+ToReadableByteArray(hashmessage));
            return Convert.ToBase64String(hashmessage);
        }

With a privatekey of "a1" and message of "b1", you get the following:使用“a1”的私钥和“b1”的消息,您将获得以下信息:

Key: 97, 49
Message: 98, 49
Hash: 219, 205, 149, 90, 235, 40, 133, 252, 91, 27, 240, 61, 201, 173, 220, 76, 73, 248, 92, 212
282VWusohfxbG/A9ya3cTEn4XNQ=

When I try to run the equivalent in PHP, I get the same bytes, but the hash is different:当我尝试在 PHP 中运行等效项时,我得到相同的字节,但 hash 不同:

$key = 'a1';
$message = 'b1';
$hmac = hash_hmac('sha1', $key, $message, true);
$hmac_base64 = base64_encode($hmac);

echo 'KEY BYTES: '.implode(',',$this->getByteArray($key)).'<br>';
echo 'MESSAGE BYTES: '.implode(',',$this->getByteArray($message)).'<br>';
echo 'HMAC BYTES: '.implode(',',$this->getByteArray($hmac)).'<br>';
echo 'HMAC: '.$hmac_base64;

function getByteArray($text) {
     $secretBytes = array();
        for($i = 0; $i < strlen($text); $i++)
         {
           $secretBytes[] = ord($text[$i]);
         }

     return $secretBytes;
}

Result:结果:

KEY BYTES: 97,49
MESSAGE BYTES: 98,49
HMAC BYTES: 3,162,147,8,198,26,126,189,195,122,228,215,10,18,187,216,22,151,202,237
HMAC: A6KTCMYafr3DeuTXChK72BaXyu0=

What am I doing wrong?我究竟做错了什么? A lot of the problems I've found on here say to set the binary output of hash_hmac to true in PHP, which I've done.我在这里发现的很多问题都说在 PHP 中将 hash_hmac 的二进制 output 设置为 true,我已经完成了。 Originally my message had return (\r) and newline chars (\n) in it so I thought it might have been an ASCII conversion issue, but running it with a1 and b1 as key and message still don't result in matching hashes, even though the byte arrays match.最初我的消息中有返回 (\r) 和换行符 (\n),所以我认为这可能是一个 ASCII 转换问题,但是使用a1b1作为键和消息运行它仍然不会导致匹配的哈希,即使字节 arrays 匹配。 Any help is appreciated, thank you in advance!任何帮助表示赞赏,在此先感谢您!

I don't know much about PHP , but according to the documentation on hash_hmac it looks as if you might have the $key and $data parameters reversed.我对PHP不太了解,但根据 hash_hmac 上的hash_hmac看起来您可能将$key$data参数颠倒了。

From the documentation:从文档中:

hash_hmac ( string $algo, string $data, string $key [, bool $raw_output = FALSE ] ): string hash_hmac ( 字符串 $algo, 字符串 $data, 字符串 $key [, bool $raw_output = FALSE ] ): 字符串

So, it looks like you're passing the $message as the key and $key as the message.因此,看起来您将$message作为密钥并将$key作为消息传递。

That was it, I had the key and message reversed.就是这样,我把钥匙和信息颠倒了。 Thank you!谢谢!

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

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