从C#移植到PHP时获得不同的base64编码
本文关键字:编码 base64 PHP | 更新日期: 2023-09-27 18:26:37
我不懂C#,我必须将一个小函数移植到PHP中。我把所有的代码分解成一个简单的例子来说明这个问题。
下面是C#部分,其中sha1哈希被base64编码:
HMACSHA1 hmacTest = new HMACSHA1();
hmacTest.Key = Convert.FromBase64String(identity);
byte[] sha1 = hmacTest.ComputeHash(new byte[]{0, 0, 0, 0, 86, 107, 192, 162, 99, 111, 110, 102});
Console.WriteLine(string.Concat(sha1.Select(b => b.ToString("x2"))));
Console.WriteLine(Convert.ToBase64String(sha1, Base64FormattingOptions.None));
// sha1: 02628928a3a2ab831a769f2fd64a3bae4036265f
// encoded: AmKJKKOiq4Madp8v1ko7rkA2Jl8=
以下是PHP部分,显示了不同的结果,尽管sha1与匹配
$key = base64_decode($identity);
$data = call_user_func_array("pack", array_merge(array("C*"), array(0, 0, 0, 0, 86, 107, 192, 162, 99, 111, 110, 102)));
$sha1 = hash_hmac('sha1', $data, $key);
var_dump($sha1, base64_encode($sha1));
// sha1: 02628928a3a2ab831a769f2fd64a3bae4036265f
// encoded: MDI2Mjg5MjhhM2EyYWI4MzFhNzY5ZjJmZDY0YTNiYWU0MDM2MjY1Zg==
我必须修改PHP部分以匹配。我认为这是一个编码问题。或者可能在C#ToBase64String中没有传递sha1的字符串版本。如果这就是它不同的原因,我该如何在PHP中复制它?
在C#代码中,sha1是一个字节数组,但在PHP代码中,我认为您的sha1是字符串
所以试试这个片段:
$sha1 = hash_hmac('sha1', $data, $key,TRUE);
使用第4个参数,您将获得原始二进制而不是字符串。