gpt4 book ai didi

c# - PHP utf8 变量编码(HMAC Key -> C# Server)

转载 作者:搜寻专家 更新时间:2023-10-31 21:03:52 26 4
gpt4 key购买 nike

我正在尝试创建一个 PHP 客户端包装器来与 .NET API 对话。我所拥有的正在工作,但我是 PHP 开发的新手,我现在所拥有的看起来可能无法 100% 地工作。

我正在尝试复制的 C# 代码:

private static void HMAC_Debug()
{
Console.WriteLine("Secret Key (Base64): 'qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs='");
var secret = Convert.FromBase64String("qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs=");

Console.WriteLine("Value To Hash (UTF8): 'MyHashingValue©'");
var value = Encoding.UTF8.GetBytes("MyHashingValue©");

using (HMACSHA256 hmac = new HMACSHA256(secret))
{
byte[] signatureBytes = hmac.ComputeHash(value);
string requestSignatureBase64String = Convert.ToBase64String(signatureBytes);

Console.WriteLine("Resulting Hash (Base64): '{0}'", requestSignatureBase64String);
}

Console.ReadLine();
}

我的 PHP 等价物:

    $rawKey = base64_decode("qCJ6KNCd/ASFOt1cL5uq2TUYcRjplpYUy7QdUmvaCTs=");

// $hashValArr = unpack("C*", utf8_encode("MyHashingValue©"));
//
// $hashVal = call_user_func_array("pack", array_merge(array("C*"), $hashValArr));

$hashVal = "MyHashingValue©";

$raw = hash_hmac("sha256", $hashVal, $rawKey, TRUE);
$rawEnc = base64_encode($raw);

echo $rawEnc;

这两个片段产生相同的 Base64 输出,但我依赖于 PHP 中的字符串变量被默认编码为 UTF8 - 这是一个正确的假设还是我可以做一些更稳定的事情?

您可以从注释掉的 PHP 行中看到,我尝试手动将其编码为 UTF8,然后为 PHP HMAC 函数提取 ASCII 字节,但它没有产生与 c# 代码相同的输出。

谢谢

马龙

最佳答案

您使用的是哪个版本的 PHP?

一般而言,您不能依赖 UTF-8 编码。事实上,您可能只是将文件存储为 UTF-8(我猜没有 BOM),但较旧的 PHP 版本(据我所知,在 PHP 7 之前)无法在本地使用 unicode,他们只是将其读取为ASCII/扩展 ASCII。

就是说,如果您不操作字符串,则您的示例可能有效,因为您只是在处理存储在变量中的字节。如果这个字节序列在您将它插入源代码时恰好是一个 UTF-8 编码的字符串,它会保持原样。

如果您从任意来源获取字符串,您应该确定使用了哪种编码,并考虑 PHP 的多字节字符串处理函数,它可以处理不同的编码 [1]。

[1] http://us2.php.net/manual/en/ref.mbstring.php

关于c# - PHP utf8 变量编码(HMAC Key -> C# Server),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com